一、编译环境
操作系统: windows 10 家庭版
Gradle版本:5.6.3
SpringFrameWork版本:5.1.19.RELEASE
IDE版本:IDEA 2018.2.6
JDK版本:1.8
二、 下载源码
从github上拉取Spring-Framework的最新源代码
git clone https://github.com/spring-projects/spring-framework.git
如果github无法访问,可以从gitee上拉取代码,gitee每天都会从github上更新一次代码。
git clone https://gitee.com/mirrors/Spring-Framework.git
因为我先编译的Spring-Boot的版本2.1.19.BUILD-SPNAPSHOT,所依赖的SpringFramework版本是5.1.19.RELEASE。因此需要对切换到5.1.x分支的5.1.19.RELEASE标签,同时创建一个自己的分支myspingframework(自己研究学习,与主分支区分开)。
git checkout -b myspringframework 5.1.19.RELEASE
三、 编译
我使用的是idea.2008。
1. 创建File -> new -> project from existing source
2. 选择gradle
3. 配置gradle路径和JDK版本,在编译的时候,我使用的gradle版本是gradle-5.6.3-all,jdk是1.8。
4. 完成导入
5. 执行编译命令
gradlew :spring-oxm:compileTestJava
gradlew :spring-beans:compileTestJava
6. 执行 gradlew build
7. 编译完成
8. 安装到本地maven仓库。
//5.1.x以上版本 不包含5.1.x使用
//gradlew publishToMavenLocal -x api -x asciidoctor -x asciidoctorPdf
//其中-x 为安装时忽略的模块,具体参照github上的wiki文档
//https://github.com/spring-projects/spring-framework/wiki/Build-from-Source
gradlew install -x javadoc
9.编译安装单独的项目
#先查看所有的task名称
gradles tasks --all
#找到对应的项目,这里以spring-context为例
gradlew spring-context:build
#也可以根据.gradle文件进行编译
gradlew --build-file=./spring-context/spring-context.gradle
#install指定项目
gradlew spring-context:install
四、编译过程中出现的问题
1. 出现could not resolve xxxxx / could not get resource xxxx / could not HEAD xxxx 401,一般是由于从仓库下载某个依赖出问题,此时需要对gradle仓库进行换源。按照网上查找资料,在换源的过程中,依然会出现这种问题,后来打开以来的仓库查找,发现不同的依赖会在不同的源中。下面是我使用的源,在build.gradle以及docs.gradle文件中。我在换完源之后,仍然会出现这些错误,但是当我在此编译之后,再次出现的错误就会消失,我的猜测是网络不稳定造成的结果。
repositories {
mavenLocal()
mavenCentral()
maven { url "https://maven.aliyun.com/repository/spring" }
maven { url 'https://maven.aliyun.com/repository/spring-plugin' }
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
maven { url "https://maven.aliyun.com/nexus/content/groups/public/" }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url "https://repo.spring.io/plugins-release" }
maven { url "https://repo.springsource.org/plugins-release" }
maven { url "https://plugins.gradle.org/m2/" }
}
2. 在执行编译的过程中,spring-core会出现cannot resolve symbol的错误,该错误主要集中在spring-core的cglib中。错误原因是springFramework依赖于springframwork包下的cglib,但是并没有提供在该包下提供cglib的源码。springframework在编译的时候会将下载的cglib转换到springframework包下。
解决办法:
1) 执行命令
gradlew objenesisRepackJar
gradlew cglibRepackJar
2) 或者执行gradle的other下的cglibRepackJar和objenessisRepackJar
3. 出现asciidoctor (SystemCallError) Unknown error 123,是由于AsciidoctorJ的版本兼容性的问题,在windows系统上会出现此问题。这个问题搞了好久,百度上没有什么有用的解决方案,最后在github上springframework的issu上查到这个问题,跳转到asciidoctor项目中,才找到有效的解决方案。
解决办法:替换build.gradle,以及docs.gradle、spring-webmvc.gradle、 spring-webflux.gradle中的AsciidoctorJ和jruby版本(https://github.com/asciidoctor/asciidoctorj/issues/471)。下载的时候如果报https://maven.aliyun.com/repository/spring/../jruby/...无法下载的问题,在 docs.gradle文件中注释掉 https://maven.aliyun.com/repository/spring仓库,重新build
//build.gradle文件
......
//16行
dependencies {
classpath("io.spring.gradle:propdeps-plugin:0.0.9.RELEASE")
classpath("io.spring.gradle:docbook-reference-plugin:0.3.1")
classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16")
classpath("org.asciidoctor:asciidoctorj:1.6.0-alpha.6")
}
.......
//docs.gradle文件
......
//33行
dependencies {
classpath("org.asciidoctor:asciidoctor-gradle-plugin:1.5.7") {
exclude group: 'org.jruby'
}
classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16") {
exclude group: 'org.jruby'
}
classpath 'org.jruby:jruby:9.1.17.0'
}
.....
//105行
asciidoctorj {
version = '1.5.3'
}
......
//spring-webmvc.gradle文件
//77行
testRuntime("org.jruby:jruby:9.1.17.0")
//spring-webflux.gradle文件
//58行
testRuntime("org.jruby:jruby:9.1.17.0")
4. 出现[RightCurly]字样的错误,是由于对代码进行格式化或者修改了代码的格式(e.g:方法的注释,多出不必要的换行;if{}else{} try{}catch{}等else、catch等关键字不能写在}后面;等等),和配置文件中定义的格式不一致导致问题得到出现。最快解决办法还原当前出错的文件。
五、后记
经过两天的折腾,看到BUILD SUCCESS的字样,心里可算是舒了一口气。在编译过程中,遇到最大的问题就是jruby版本的问题(几乎所有的时间都花在了解决这个问题上),国内的各大论坛上的办法都试了一遍(其实也没查到几个),最后还是在github上找到了有效的解决办法。这就告诉我,遇到问题,还是要从源头去寻找。接下来就要开始spring源码学习的旅程了。加油。