Spring5.X编译踩坑合集

Spring&编译

Posted by MistRay on August 20, 2019

1.Spring5.0

springframework Spring 5.0是在2013年发布Spring 4后的第一个大版本.该次升级也更新了不少的新特性. 基本可以归为如下几类:

  • JDK版本升级
  • Core框架修订,核心容器更新
  • Kotlin函数式编程
  • 响应式编程模型
  • 测试改进
  • 额外库支持
  • 停止维护一些特性

升级内容的详细信息可以参考 whats-new-in-spring-framework-5Spring Framework 5.0 新特性

2.编译源码的原因

如果想要深入理解Spring的特性并学习优秀开源项目的编程范式,必然要到源码中分析实现细节.但仅通过view代码的形式是无法明晰某些复杂逻辑的. Spring的源码中提供了很多单元测试,我们可以通过Debug单元测试的形式来加深对组件的理解.

3.踩坑细节

1.版本控制工具Gradle

gradle Gradle虽然特性优于Maven,且有完善的task体系.但终究是个战未来的工具,对于大多数人来说Gradle还是一个相对陌生的东西. 但我们的目的是编译Spring源码,对于技术栈中没有Gradle的人来说Gradle就成了一道绕不过的坎.

我使用的Gradle版本为5.5.1. 在运行build.gradle的过程中,由于连接的依赖仓库为外网仓库,所以网速惨不忍睹.我build了两个小时+都没有完成. 这时有两个解决方案.

  1. 修改中央仓库地址
    build.gradle中的maven中央仓库地址更换为阿里云的私服
     http://maven.aliyun.com/nexus/content/groups/public/
    

    依赖中有些内容是私服中所没有的,解决方案是先使用私服把能下载的依赖都下载了,再切回中央仓库将剩余依赖下载,可以节省很多时间.

  2. 使用代理
    有梯子的小伙伴可以直接使用代理下载依赖,速度会快很多.

2.spring-core核心代码报错

spring-core编译时CoroutinesUtils找不到.

运行build.gradle后,会在spring-core-coroutines包中生成build文件夹,将buildlibs的内容导入到spring-core的依赖中即可解决该问题.

3.build顺序问题

由于spring-framework内的组件大部分都引用了spring-oxmspring-core.所以需要提前先编译这两个包 ,否则直接编译其他包会显示缺依赖而直接失败.

运行这两个包内的compileTestJavaTask.
compile 运行完成后,就可以继续编译我们常用的组件,例如:spring-beansspring-context了.

4.idea中kotlin插件冲突问题

Error:Kotlin: [Internal Error] java.lang.LinkageError: loader constraint violation: loader (instance of org/jetbrains/kotlin/cli/jvm/plugins/PluginURLClassLoader$SelfThenParentURLClassLoader) previously initiated loading for a different type with name "kotlin/sequences/Sequence"

Kotlin_Internal_Error

直接关闭idea的kotlin插件即可.

5.关于spring-aspects的问题

由于引用了IntelliJ IDEA未知的方面类型,因此spring-aspects不会编译.可以从项目中排除’spring-aspects’以避免编译错误.

4.reference

5.转载

本文遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。