解决问题过程: (《Spring 源码深度解析》中介绍的解决过程和下面的有一点不同,不过最终都是导入jar包
spring-objenesis-repack 和 spring-cglib-repack)
百度云盘链接: https://pan.baidu.com/s/1YVcXmZnKKYisgRk3yZ8tFA 提取码:q561
这是因为spring在构建中,为了防止冲突,没有引入这两个包,需要自己引入,多数模块都有依赖到这两个包,
如 core (main和test 文件夹中都有):
但是又报了新的错误: 找不到符号: 类 AnnotationBeanConfigurerAspect ,JCacheCacheAspect ,AnnotationAsyncExecutionAspect ,AnnotationCacheAspect ,AnnotationTransactionAspect ,具体如下:
D:\workspace\spring-framework-5.1.x\spring-aspects\src\main\java\org\springframework\context\annotation\aspectj\SpringConfiguredConfiguration.java
Error:(19, 49) java: 找不到符号
符号: 类 AnnotationBeanConfigurerAspect
位置: 程序包 org.springframework.beans.factory.aspectj
Error:(47, 16) java: 找不到符号
符号: 类 AnnotationBeanConfigurerAspect
位置: 类 org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration
Error:(48, 24) java: 找不到符号
符号: 变量 AnnotationBeanConfigurerAspect
位置: 类 org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration
D:\workspace\spring-framework-5.1.x\spring-aspects\src\main\java\org\springframework\cache\aspectj\AspectJJCacheConfiguration.java
Error:(42, 16) java: 找不到符号
符号: 类 JCacheCacheAspect
位置: 类 org.springframework.cache.aspectj.AspectJJCacheConfiguration
Error:(43, 17) java: 找不到符号
符号: 类 JCacheCacheAspect
位置: 类 org.springframework.cache.aspectj.AspectJJCacheConfiguration
Error:(43, 49) java: 找不到符号
符号: 变量 JCacheCacheAspect
位置: 类 org.springframework.cache.aspectj.AspectJJCacheConfiguration
D:\workspace\spring-framework-5.1.x\spring-aspects\src\main\java\org\springframework\scheduling\aspectj\AspectJAsyncConfiguration.java
Error:(43, 16) java: 找不到符号
符号: 类 AnnotationAsyncExecutionAspect
位置: 类 org.springframework.scheduling.aspectj.AspectJAsyncConfiguration
Error:(44, 17) java: 找不到符号
符号: 类 AnnotationAsyncExecutionAspect
位置: 类 org.springframework.scheduling.aspectj.AspectJAsyncConfiguration
Error:(44, 62) java: 找不到符号
符号: 变量 AnnotationAsyncExecutionAspect
位置: 类 org.springframework.scheduling.aspectj.AspectJAsyncConfiguration
D:\workspace\spring-framework-5.1.x\spring-aspects\src\main\java\org\springframework\cache\aspectj\AspectJCachingConfiguration.java
Error:(42, 16) java: 找不到符号
符号: 类 AnnotationCacheAspect
位置: 类 org.springframework.cache.aspectj.AspectJCachingConfiguration
Error:(43, 17) java: 找不到符号
符号: 类 AnnotationCacheAspect
位置: 类 org.springframework.cache.aspectj.AspectJCachingConfiguration
Error:(43, 53) java: 找不到符号
符号: 变量 AnnotationCacheAspect
位置: 类 org.springframework.cache.aspectj.AspectJCachingConfiguration
D:\workspace\spring-framework-5.1.x\spring-aspects\src\main\java\org\springframework\transaction\aspectj\AspectJTransactionManagementConfiguration.java
Error:(42, 16) java: 找不到符号
符号: 类 AnnotationTransactionAspect
位置: 类 org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration
Error:(43, 17) java: 找不到符号
符号: 类 AnnotationTransactionAspect
位置: 类 org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration
Error:(43, 56) java: 找不到符号
符号: 变量 AnnotationTransactionAspect
位置: 类 org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration
问题原因是spring源码的AOP使用了aspectJ ,而java不识别aspectJ
解决过程:
下载AspectJ
https://www.eclipse.org/aspectj/downloads.php
安装过程中3个设置我都是默认的 直接next(注意第二步要设置自己已经安装的jdk家目录)
安装第二部,要选择自己的jdk目录,如果jdk是安装板的,这里会自动选择,如果不是安装板的,需要手动选择一下。
选择aspectj安装目录
选择install。
File -> Project Structure -> Facets -> 点击 + 按钮 -> AspectJ -> 选择 spring-aop_main -> 点击OK -> 右键spring-aop_main的Kotlin 选择删除,(注意:如果发现idea的Facets点击后,右侧区域没反应,将项目删除,重新解压->导入idea即可)具体过程如下
最终的样子:
同上面给spring-aop_main添加Facets属性一样 给 spring-aspects_main 也添加Facets属性
再次编译 Build -> Build Project
D:\workspace\spring-framework-5.1.x\spring-oxm\src\test\java\org\springframework\oxm\jaxb\Jaxb2UnmarshallerTests.java
Error:(36, 41) java: 程序包org.springframework.oxm.jaxb.test不存在
Error:(37, 41) java: 程序包org.springframework.oxm.jaxb.test不存在
Error:(65, 17) java: 找不到符号
符号: 类 Flights
位置: 类 org.springframework.oxm.jaxb.Jaxb2UnmarshallerTests
Error:(65, 36) java: 找不到符号
符号: 类 Flights
位置: 类 org.springframework.oxm.jaxb.Jaxb2UnmarshallerTests
Error:(73, 17) java: 找不到符号
符号: 类 FlightType
位置: 类 org.springframework.oxm.jaxb.Jaxb2UnmarshallerTests
依次执行当前模块下的两个命令,最后clean,build 该模块即可
这个问题比较厉害,暴力解决
发现这几个错误,主要在test文件夹中,并不影响我们阅读Spring源码。简单起见,直接将相关测试代码注释掉。。
到此 spring 源码下载安装结束,可以开始源码学习了!