准備工作
1.首先從github或者gitee上下載5.2.X分支的代碼。master分支需要JDK11的支持,這里選取5.2.X只需要JDK8的支持。
git clone -b 5.2.x https://github.com/spring-projects/spring-framework.git
git clone -b 5.2.x https://gitee.com/mirrors/Spring-Framework.git
2.環境與工具
Win10
JDK8, Maven3, Gradle5.6.4, IDEA2020.1
3.以上環境配置好之后,需要改造下載的Spring源碼的配置文件:
3.1 build.gradle中,將有問題的引用注釋掉:
plugins {
id 'io.spring.dependency-management' version '1.0.9.RELEASE' apply false
// id 'io.spring.gradle-enterprise-conventions' version '0.0.2'
id 'io.spring.nohttp' version '0.0.5.RELEASE'
id 'org.jetbrains.kotlin.jvm' version '1.3.72' apply false
id 'org.jetbrains.dokka' version '0.10.1' apply false
id 'org.asciidoctor.jvm.convert' version '2.4.0'
id 'org.asciidoctor.jvm.pdf' version '2.4.0'
id 'de.undercouch.download' version '4.1.1'
id "io.freefair.aspectj" version '4.1.6' apply false
id "com.github.ben-manes.versions" version '0.28.0'
id 'com.gradle.build-scan' version '3.2'
id "com.jfrog.artifactory" version '4.12.0' apply false
}
另外,添加幾個依賴,避免編譯時的錯誤
dependency "com.sun.activation:javax.activation:1.2.0" dependency "com.sun.mail:javax.mail:1.6.2"
//添加以下三組依賴 dependency "com.google.guava:guava:18.0" dependency "com.sun.istack:istack-commons-runtime:2.16" dependency "com.sun.xml.fastinfoset:FastInfoset:1.2.12" dependencySet(group: 'com.sun.xml.bind', version: '2.3.0.1') { entry 'jaxb-core' entry 'jaxb-impl' entry 'jaxb-xjc' }
3.2 settings.gradle中修改maven.url為阿里雲鏡像,加快資源請求速度:
pluginManagement { repositories { gradlePluginPortal() maven { url 'https://maven.aliyun.com/repository/spring-plugin' } } }
3.3 spring-beans/spring-beans.gradle中將最下面的四行注釋掉
//def deps = compileGroovy.taskDependencies.immutableValues + compileGroovy.taskDependencies.mutableValues //compileGroovy.dependsOn = deps - "compileJava" //compileKotlin.dependsOn(compileGroovy) //compileKotlin.classpath += files(compileGroovy.destinationDir)
后續的步驟參考了https://www.programmersought.com/article/34134242929/
4.參考源代碼工程中的import-into-idea.md,但執行完這里的步驟還是不能順利完成整個環境的搭建。
4.1 在CMD中使用gradle命令進行預編譯,進入到工程目錄,依次執行以下兩個命令:
gradlew.bat :spring-oxm:compileTestJava
gradlew.bat build -x test
4.2 以上兩個命令執行成功后,將代碼引入IDEA中
File -> New -> Project from Existing Sources -> Navigate to directory。引入代碼后,Gradle會自動進行構建。
另外,在編譯過程中出現了IDEA控制台中文亂碼,除了在IDEA/bin目錄下修改了idea.exe.vmoptions以及idea64.exe.vmoptions,在最下方添加了
-Dfile.encoding=utf-8
在Help->Edit Custom VM Options中也添加一行
-Dfile.encoding=utf-8
5. 構建工作完成之后,需要將spring-aspects排除。這是Spring's AOP內嵌的aspects,但無法在IDEA中編譯通過。參考http://youtrack.jetbrains.com/issue/IDEA-64446
5.1 選擇spring-aspects,右鍵彈出"Load/Unload Moudules" ,將整個spring-aspects卸載
6.創建工程,寫一個樣例代碼,並將我們編譯的Spring模塊引入到該工程中。
6.1
6.1.1 新建一個Maven工程:
6.1.2 引用編譯的模塊:
6.2 修改pom文件(注意Junit已修改為4.12)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SpringFrameworkDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>SpringFrameworkDemo</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Introduce commons-logging dependency -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<!-- Static resource path configuration -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
6.3 定義了接口與實現:
6.4 config.xml
<?xml version="1.0" encoding="UTF-8"?> <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="loginService" class="org.example.serviceImpl.LoginImpl"/> </beans>
6.5 代碼測試:
這里已經對源代碼進行了修改: