Spring源码编译和错误解决

4,310 阅读2分钟

源码获取

  • 进入GitHub官网,搜索spring,找到spring-framework项目。如下图。
  • 选择最新分支,这里我们选择5.1.x。如下图。
  • 拉取到本地,或者直接下载。如下图。

源码导入构建

  • 打开IDEA,导入源码工程。如下图。
  • 选择Gradle项目导入,之后直接Finish即可。如下图。
  • 导入后工程界面显示,如下图。
    ###解决编译错误问题一:cglib和objenesis jar包的缺失
  • 问题发现:到了这里,我们执行build,会报错。如下图。
  • 问题原因:为了避免第三方class的冲突,Spring把最新的cglib和objenesis给重新打包(repack)了。它并没有在源码里提供这部分的代码,而是直接将其放在jar包当中,这也就导致了我们拉取代码后出现编译错误。
  • 问题解决:
  1. 确保机器安装好Gradle。并且设置好环境变量。
  2. 进入到源代码的目录下,执行命令来生成两个缺失的jar包。
  3. 将生成的两个jar包放到libs目录下,然后把libs目录拷贝到spring-core目录下。如下图。
  4. 最后对spring-core目录下的文件spring-core.gradle进行编辑。使得两个jar包成功被引用。compile fileTree(dir: 'libs', include: '*.jar')。如下图。
  5. 重新编译,此问题不再提示错误。

###解决编译错误问题二:AspectJ编译

  • 问题发现:虽然不再提示上面jar的错误,但此时提示另一个编译错误。如下图。类的声明居然使用了aspect而不是class。
  • 问题原因:Spring为了支持AOP技术的实现,引入了AspectJ来实现这一重要功能。上图中的aspect并不是java支持的关键字,而是AspectJ才认识的关键字。而原来的javac是无法识别出类前的aspect的,需要使用ajc.exe来执行编译。可以简单理解为ajc命令是增加版的javac命令。
  • 问题解决:
  1. 安装AspectJ,安装过程没有难点,选择最新稳定版安装即可,过程这里忽略。
  2. 为spring-aspect工程添加Facets属性。 【File】->【Project Structure】,进入到页面后点击“+”添加,如下图。
    添加spring-aop_mian,结果如下图。
    添加spring-aspects_mian,结果如下图。
    删除Facets。
  3. 修改IDEA配置,使其支持Ajc编译。 【File】->【Setting】,修改地方如下图。
  4. 到此,重新编译,成功。还有一些测试类报错已经不影响调试阅读。可以直接删掉报错的地方,当然有兴趣解决的,也可以在另外自己解决。

整个Spring源码构建编译已完成。欢迎留言讨论分享~