環境准備
- Gradle:5.6.4(類似Maven構建工具)
- Jdk:1.8.0_181
- idea:2021.1.1 Community Edition(社區版)
1、下載Spring源碼
官網地址:https://github.com/spring-projects/spring-framework
選擇需要的版本下載。
本例下載的是 5.2.4.RELEASE 版本,下載完后解壓。
源碼中有文件 import-into-idea.md ,導入idea說明文件,可以進行參考
2、使用gradle,編譯compileTestJava模塊
1、gradle版本選擇
可以參考spring目錄中的gradle版本(5.6.4)
命令:cat ./gradle/wrapper/gradle-wrapper.properties
最好使用對應版本的gradle進行編譯,否則可能出現版本問題
2、設置項目的gradle倉庫鏡像
修改spring項目中的 build.gradle 文件,添加本地倉庫 和 aliyun鏡像
repositories { // 配置先從本地倉庫尋找jar包,優先尋找上一個配置,找到不執行下面的配置 // 本地倉庫位於USER_HOME/.m2/repository mavenLocal() // aliyun鏡像 maven { url 'https://maven.aliyun.com/nexus/content/groups/public/'} // Maven的中央倉庫 mavenCentral() // Spring Maven 倉庫 maven { url "https://repo.spring.io/libs-spring-framework-build" } }
3、使用gradle編譯compileTestJava模塊
進入spring目錄命令:cd /Users/h__d/Downloads/spring-framework-5.2.4.RELEASE
命令:/Users/h__d/Applications/gradle-5.6.4/bin/gradle :spring-oxm:compileTestJava
3、使用Idea打開項目
File --> Open --> 選擇Spring項目目錄spring-framework-5.2.4.RELEASE
4、測試使用
可以自己找到項目中的測試類進行運行
本例找的是 spring-context 項目中的 test/java包下的AnnotationConfigApplicationContextTests.java
java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java
運行AnnotationConfigApplicationContextTests.java中的測試方法 registerAndRefresh()
能運行成功,已成功編譯,且能使用
5、可能出現的問題
問題1:類 org.springframework.core.ReactiveAdapterRegistry.CoroutinesRegistrar 的引用問題
報錯類 ReactiveAdapterRegistry 位置在 spring-core --> src/main/java 中
解決:問題是由於CoroutinesRegistrar類無法引用到引起的,通過搜索找到CoroutinesRegistrar的源碼位置,發現CoroutinesRegistrar是一個kotlin編寫的類
所以對應模塊中引入它的jar包即可
引入:右鍵 spring-core/kotlin-coroutines/build/libs/kotlin-coroutines-5.2.4.RELEASE.jar --> Add as Library --> Create Library --> 添加到對應的模塊
也可以在項目中的結構進行設置(File --> Library --> 進行設置),是spring-core.main模塊能夠引用到 kotlin-coroutines-5.2.4.RELEASE.jar 包
如果其他項目出現類找不到的問題,也是這種解決方案
6、自定義Spring模塊使用
參考Spring項目中的其他模塊
1、新建項目目錄sprign-my
右鍵spring項目名 --> new --> Directory --> 新建目錄
創建maven項目中對應的各種包
2、項目中新建文件 spring-my.gradle
description = "Spring MY" apply plugin: "kotlin" apply plugin: 'java' dependencies { compile(project(":spring-core")) optional(project(":spring-beans")) optional(project(":spring-context")) }
3、在Spring項目中添加模塊spring-my
找到spring項目配置文件 settings.gradle,增加包含模塊 spring-my
然后刷新grandle項目
4、對spring-my模塊進行編碼
編輯配置類 MainConfig.java
1 package com.test.my; 2 import org.springframework.context.annotation.Bean; 3 import org.springframework.context.annotation.Configuration; 4 5 import java.util.Date; 6 7 @Configuration 8 public class MainConfig { 9 10 @Bean 11 public Date date() { 12 Date date = new Date(); 13 return date; 14 } 15 16 }
編輯主類 MainStarter.java
1 package com.test.my; 2 3 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 4 5 import java.util.Date; 6 7 public class MainStarter { 8 9 public static void main(String[] args) { 10 11 // 注解配置引用上下文 12 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class); 13 14 // 獲取bean 15 Date date = (Date) context.getBean("date"); 16 System.out.println(date); 17 18 // 關閉上下文 19 context.close(); 20 } 21 }
5、測試spring-my模塊
運行主類 MainStarter.java即可
7、Gradle發布Spring項目
1、項目版本修改,在文件gradle.properties 中
version=5.2.4.RELEASE-MY
2、class.jar和sources.jar及javadoc.jar 三種jar包
-
打包sourcesJar任務 和 打包javadocJar任務,代碼在 gradle/spring-module.gradle 文件中
-
發布代碼在gradle/publications.gradle 文件中
3、執行命令
打包sourcesJar任務命令:gradle sourcesJar
打包javadocJar任務命令:gradle javadocJar
發布到配置倉庫命令:gradle publish
發布到本地倉庫命令:gradle publishToMavenLocal
這樣其他項目就根據maven依賴自己編譯的Spring代碼了
可能出現的錯誤
1、問題:Kotlin插件版本不對
錯誤:/Users/h__d/Documents/git-repository/spring-framework-5.2.4/spring-core/build/libs/spring-core-5.2.4.RELEASE.jar!/META-INF/spring-framework-5.2.4.spring-core.main.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.16.
解決1:
可能跟idea有關,退出idea,將idea相關配置刪除,使用命令窗口進行發布
解決2:
- 刪除idea中原有的Kotlin插件
- 官網:https://plugins.jetbrains.com,下載對應版本的Kotlin插件
- idea離線安裝Kotlin插件(可自行百度)
- 安裝的時候,選擇kotlin/lib/kotlin-plugin.jar 即可
2、問題:發布到本地倉庫太慢
解決:
- 將 gradle/spring-module.gradle 文件中,注釋掉artifact javadocJar代碼
publishing { publications { mavenJava(MavenPublication) { from components.java artifact sourcesJar // artifact javadocJar } } }
- 將 gradle/publications.gradle 文件中,pom 相關的注釋掉
publishing { publications { mavenJava(MavenPublication) { // pom { // afterEvaluate { // name = project.description // description = project.description // } // ...... // } } } }