Spring源碼編譯調(diào)試
學(xué)習(xí)Spring源碼首先要本地下載源碼后編譯通過才能調(diào)試Spring,本文章主要介紹Spring源碼在本地的編譯和調(diào)試莉恼。 首先下載Spring源碼拌喉,如果不做開源貢獻(xiàn),只是自己編譯調(diào)試源碼的話直接下載源碼壓縮包俐银,解壓后導(dǎo)入Intellij尿背。如果需要提交代碼到Spring的話需要直接從git CheckOut出來。后續(xù)編譯調(diào)試都是一樣的捶惜。
首先打開Spring官方網(wǎng)站打開SpringFramework項(xiàng)目 https://spring.io/projects/spring-framework#overview
直接從圖中紅框處進(jìn)入Spring源碼托管平臺(tái)GitHub田藐,頁可以直接訪問 https://spring.io/projects/spring-framework#overview
從Branch進(jìn)入,切換Tags吱七,選擇最新的Release(官方最新穩(wěn)定版本)版本汽久,
下載Zip壓縮包到本地踊餐,將壓縮包復(fù)制到自己的項(xiàng)目目錄下
cp /Users/wsq/Downloads/spring-framework-5.2.0.RELEASE.zip /Users/wsq/Documents/spring_compile
然后解壓壓縮包:
cd /Users/wsq/Documents/spring_compile
unzip spring-framework-5.2.0.RELEASE.zip
Spring默認(rèn)使用gradle進(jìn)行構(gòu)建窜管,有的同學(xué)會(huì)自己主動(dòng)下載gradle,其實(shí)是沒有必要的纬乍,Spring源碼已經(jīng)將Gradle可執(zhí)行文件和源碼一起打包了的,,所以下載源碼后編譯一個(gè)模塊,gradle就會(huì)主動(dòng)被下載安裝,如下是Spring源碼包的文件:其中就有g(shù)radlew,gradlew.bat等文件。
編譯前需要設(shè)置Maven的Settings.xml文件鏡像為阿里云姨拥,這樣下載依賴快一點(diǎn)憨奸。
如下是Settings.xml的內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>/Users/wsq/.m2/alibaba/repository</localRepository>
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
然后在Intellij中設(shè)置Maven的settings.xml的位置:
Spring源碼托管地址下面有編譯Spring源碼的步驟:
進(jìn)入Spring源碼目錄進(jìn)行部分模塊的編譯,順便安裝gradle
編譯前也需要在gradle配置中配置阿里云鏡像:
進(jìn)入Spring源碼目錄,打開build.gradle文件添加如下內(nèi)容:
buildscript {
repositories {
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}
dependencies {
classpath 'org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16'
classpath 'io.spring.asciidoctor:spring-asciidoctor-extensions:0.1.3.RELEASE'
}
}
repositories {
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
運(yùn)行命令./gradlew :spring-oxm:compileTestJava 進(jìn)行oxm模塊的編譯,稍等片刻編譯通過后,導(dǎo)入Intellij
編譯成功后蔫饰,導(dǎo)入Intellij,導(dǎo)入后會(huì)發(fā)現(xiàn)所有模塊代碼都正常的越除,但是spring-aspects模塊報(bào)錯(cuò)饱苟,如果不需要調(diào)試這個(gè)module可以從項(xiàng)目中排出這個(gè)module城须,如果需要這個(gè)module的話為了保證編譯通過需要手動(dòng)下載Aspect
總體來說如果想保留spring-aspects模塊就需要手動(dòng)下載安裝Aspect ,如果不需要的話直接從項(xiàng)目中移除。一般來說后續(xù)就可以直接build成功項(xiàng)目了训挡,如果Inteiil版本太低的話表悬,編譯時(shí)會(huì)報(bào)錯(cuò):Kotin LinkageError饭庞,直接更新Intellij版本就可以了寒矿。
build成功后如下:
Spring項(xiàng)目調(diào)試
在Spring項(xiàng)目中新建一個(gè)Module spring-demo
新建自己的包和源碼蓝牲,運(yùn)行:就可以調(diào)試了
注意自己新建的Module要新建為gradle構(gòu)建的翎嫡;新建后在build.gradle中添加如下配置
compile(project(":spring-context"))
testCompile group: 'junit', name: 'junit', version: '4.12'
}
源碼如下:
String sayHello(String naem);
}
@Override
public String sayHello(String naem) {
System.out.println("Hellow :" + naem);
return "success";
}
}
public static void main(String args[]) {
System.out.println("Spring 項(xiàng)目成功編譯3岢Hν铡<ù唷靴迫!");
String path = "http://Users/wsq/Documents/spring/spring-framework-5.2.0.RELEASE/springdemo/src/main/resources/spring/spring-config.xml";
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(path);
WelcomeService ws = (WelcomeService) applicationContext.getBean("welcomeService");
ws.sayHello("wsq");
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="welcomeService" class="cn.com.yuns.service.impl.WelcomeServiceImpl"/>
</beans>
運(yùn)行結(jié)果如下:
Task :springdemo:compileJava
Task :springdemo:classes
Task :springdemo:Entrance.main()
Spring 項(xiàng)目成功編譯i凇C裥А!帚呼!
Hellow :wsq
BUILD SUCCESSFUL in 9s
33 actionable tasks: 4 executed, 29 up-to-date
7:52:28 下午: Task execution finished 'Entrance.main()'.