Spring源碼編譯一次性通過&遇到的坑解決方法
前言
spring源碼本地編譯,按網上的博客參考資料的操作步驟,總是會出現各種莫名其妙的錯誤。根據錯誤信息找解決方案,但在自己的環境下又總是編譯不過去。結合參加培訓學習Jack老師提供的方法,自己多種方式嘗試,最終編譯成功了。
為了驗證自己的方式是否有失誤的地方,全部過程我自己走了大概5遍,詳細記錄下每個步驟。如果按1天8小時計的話,為了這個源碼編譯至少花了3~4天時間。我覺得是值得的,為後面的源碼閱讀掃除一個攔路虎。
僅以此篇記錄踩到的坑,為同樣想讀源碼的同學可以在編譯這一步少花一些時間,也可以後面源碼閱讀增加自信心。同時感謝在網上留下博客的同學,給予我相當多的幫助,這也是我想寫這篇文章的原因。
參考博客:
//www.it610.com/article/1295306604677242880.htm
//www.cnblogs.com/haoxianrui/p/12825586.html
//www.cnblogs.com/jhj117/p/5455081.html
1.資源及環境說明:
idea 2019.3.3
gradle-5.6.4版本(對源碼裏面的版本,版本需要一致,否則編譯過程會出現各種異常)
jdk1.8 or 以上版本
spring-5.2.8.RELEASE
系統:win7 or 以上
2.下載源碼
選擇gitee下載速度快,官網速度非常慢,耗時約60s
git clone --branch v5.2.8.RELEASE //gitee.com/Z201/spring-framework.git
2.1.查看源碼gradle版本號
查看文件路徑:/gradle/wrapper/gradle-wrapper.properties
對應的gradle版本:gradle-5.6.4-bin.zip
3.gradle下載&配置環境變量
3.1.gradle下載
# gradle 下載地址
//services.gradle.org/distributions/
選擇版本: gradle-5.6.4-bin.zip
下載到本機,並解壓到指定路徑
3.2.配置環境變量
配置環境變量
變量名:GRADLE_HOME
變量值:A:\java_about\gradle-5.6.4
在Path加上 ;%GRADLE_HOME%\bin
3.3.驗證gradle
4.源碼配置相關修改
4.1.gradle-wrapper.properties配置修改
目錄:spring-framework/gradle/wrapper
修改 distributionUrl=file:///A:/java_about/gradle-5.6.4-bin.zip #(本機的所在路徑)
4.2.確認kotlin版本號
先查看idea的kotlin版本,查看路徑:File->Setting->Plugins,搜索kotlin,如果還沒安裝過先安裝一下。
我的版本號是1.3.61
4.3.build.gradle配置
目標文件:build.gradle 在根目錄下
4.3.1.注釋gradle企業約束
因為該plugins不注釋,會發生很多不可預期的錯誤,
搜索關鍵字:io.spring.gradle-enterprise-conventions
注釋如下:
// id 'io.spring.gradle-enterprise-conventions' version '0.0.2'
4.3.2.確認kotlin版本號是否一致
如果不一致,修改成跟idea的kotlin的版本號一樣,我的版本號為1.3.61,而Spring-5.2.8.RELEASE對應kotlin的版本號是1.3.72,所以需要修改。需要修改的地方有2處
搜索關鍵字:kotlin.jvm , kotlin-bom
4.3.3.添加上阿里鏡像
為倉庫添加上阿里鏡像,目的是加快資源下載,編譯速度加快。行號約279,在dependencyManagement下的repositories 添加:
maven { url '//maven.aliyun.com/nexus/content/groups/public/' }
maven { url '//maven.aliyun.com/nexus/content/repositories/jcenter'}
4.4.settings.gradle配置
為插件倉庫添加上阿里鏡像,行號約2,在pluginManagement下的repositories 添加:
maven { url "//maven.aliyun.com/repository/public" }
4.5.解決gradle build慢問題
目標文件:gradle.properties
1.增加內存分配 -- 這個按本機的內存去分配,我的是16G
org.gradle.jvmargs=-Xmx2048M
2.按需配置
org.gradle.configureondemand=true
3.開啟守護進程
org.gradle.daemon=true
5.idea導入源碼
依次點擊File->New->Project from Existing Sources,選擇源碼包路徑下的build.gradle文件完成源碼導入
5.1.idea配置gradle
可以預先打開idea配置,也可在導入過程中去配置(導入後會出現一個進度條,選擇backgroud後台運行)
操作路徑:File->Setting->Build,Execution,Deployment->Build Tools->Gradle
5.2.導入等待&configure成功
以上設置完成後,就是等待過程了,具體多長時間看網速,我的導入編譯完成耗時約11m 57s,一次性成功。
編譯日誌內容如下:
Starting Gradle Daemon...
Gradle Daemon started in 4 s 477 ms
> Task :buildSrc:compileJava
> Task :buildSrc:compileGroovy NO-SOURCE
> Task :buildSrc:pluginDescriptors
> Task :buildSrc:processResources
> Task :buildSrc:classes
> Task :buildSrc:jar
> Task :buildSrc:assemble
> Task :buildSrc:pluginUnderTestMetadata
> Task :buildSrc:compileTestJava NO-SOURCE
> Task :buildSrc:compileTestGroovy NO-SOURCE
> Task :buildSrc:processTestResources NO-SOURCE
> Task :buildSrc:testClasses UP-TO-DATE
> Task :buildSrc:test NO-SOURCE
> Task :buildSrc:validateTaskProperties
> Task :buildSrc:check
> Task :buildSrc:build
CONFIGURE SUCCESSFUL in 11m 57s
5.3.預編譯
在idea底部菜單欄,切到Terminal菜單,輸入spring-oxm的預編譯命令:
gradlew :spring-oxm:compileTestJava
預編譯成功,耗時約 29s:
6.測試
6.1.前置說明
在spring-context添加測試類,測試驗證是否能編譯通過,拿到實例的對象。
6.2.添加測試實體類
為了快速定位到,先添加測試的package: com.elephant.bean , 創建Student實體類
package com.elephant.bean;
import org.springframework.stereotype.Service;
@Service
public class Student {
private String username = "elephant";
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
6.3.測試配置文件
spring-test.xml ,目錄在test/resources,內容如下:
<beans xmlns="//www.springframework.org/schema/beans"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xmlns:context="//www.springframework.org/schema/context"
xsi:schemaLocation="
//www.springframework.org/schema/beans
//www.springframework.org/schema/beans/spring-beans.xsd
//www.springframework.org/schema/context
//www.springframework.org/schema/context/spring-context.xsd
">
<context:component-scan base-package="com.elephant"/>
</beans>
6.4.添加測試類
為了快速定位到,先添加測試的package: com.elephant.test , 創建MyTest類
package com.elephant.test;
import com.elephant.bean.Student;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void test1() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-test.xml");
Student student = (Student)applicationContext.getBean("student");
System.out.println(student.getUsername());
System.out.println("我獲取用戶名了:"+student.getUsername());
}
}
6.5.運行測試
在類MyTest 方法 test1() 右擊Run,然後等待運行結果。
6.6.運行結果
耗時約 1m 36s
預期結果:成功打印出student的userName , 結果符合預期,成功!
我獲取用戶名了:elephant
BUILD SUCCESSFUL in 1m 36s
50 actionable tasks: 26 executed, 7 from cache, 17 up-to-date
The remote build cache was disabled during the build due to errors.
18:34:24: Tasks execution finished ':spring-context:cleanTest :spring-context:test --tests "com.elephant.test.MyTest.test1"'.