這兩天一直在解決編譯spring源碼的問題,期間失敗了無數次。當然失敗的原因也各不相同,下面我主要列舉我在編譯期間遇到的問題進行記錄。如果大伙兒遇到相同的問題,希望可以給到解決的靈感。好了話不多說,我先來說說編譯spring的前期准備。
准備:1、在github上下載源碼 可以git clone 或者 down zip
2、下載gradle
3、IDEA 這個不用多說
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
現在手中我已經有了spring的源碼,打開里面是這些文件
1、和大多數博客寫的一樣,首先如果你導入IDEA,那么點開import-into-idea.md,到project的根目錄下 cmd運行 gradlew :spring-oxm:compileTestJava
-
Precompile
spring-oxm
with./gradlew :spring-oxm:compileTestJava
-
Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
-
When prompted exclude the
spring-aspects
module (or after the import via File-> Project Structure -> Modules) -
注意:這期間一般會失敗多次 ,然后這個命令還會下載一個新的gradle(雖然我不太喜歡這樣,畢竟我自己已經下了一個). 由於時間太長了,所以我們還需要配置gradle國內鏡像源。后來為了使用這個新下載的gradle,所以我在C:\Users\xxx\.gradle\wrapper\dists\gradle-6.4-bin\aj6cyggqps6mdbpl6cfppfwqk\gradle-6.4 這個目錄下,新建init.d文件夾,init.d文件夾下新建init.gradle文件,並且寫入一下內容:
allprojects{ repositories { def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public' def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL." remove repo } if (url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL." remove repo } } } maven { url ALIYUN_REPOSITORY_URL url ALIYUN_JCENTER_URL } } }
第二個要注意的是,雖然這里全局配置了阿里的鏡像源,但是並不是所有的版本阿里鏡像源都有,所以在后面jar包因為版本問題無法下載時,你最后把這個文件再刪除了。就不走全局的配置了。
第三個要注意的是,如果明明聯網了,但是還是不能下載,那么就連手機熱點把 這個方法有時候有點用。
2、當上一步完成后,其實就可以導入IDEA了。
再導入源碼之前,我建議你先到這個界面,在設置里面把gradle maven 之類配置好。
3、點擊open后,IDEA就會幫你自動導入。在此期間它會幫你繼續下載需要的jar包,還記的我上面說的如果沒辦法下載了 記得連連手機熱點,並且刪除init.gradle試試。
這里需要注意的是,你最好再更改下settings.gradle里面的
pluginManagement {
repositories {
maven {url "http://maven.aliyun.com/nexus/content/groups/public/" }
mavenCentral()
gradlePluginPortal()
maven { url 'https://repo.spring.io/plugins-release' }
maven { url "https://maven.aliyun.com/repository/spring-plugin" }
}
}
這里可以幫你加速下載jar 。以及build.gradle中的
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" }
}
4、如果以上步驟,均沒有問題那么你會得到一個新的界面:
gradle是可以展開的。
接下來你就需要測試了,這里掛一個鏈接:https://www.bilibili.com/video/BV1XJ41117tT?from=search&seid=11806535173146251076 這個視頻說了如何測試。
但是我要說的是,按照視頻里面會出現一個錯誤:
spring 編譯 出的錯誤 Error:(347, 51) java: 找不到符號 符號: 變量 CoroutinesUtils 位置:
當然,很多博主都對這個問題做出了解決:https://blog.csdn.net/gooaaee/article/details/104437902
但是我要說的是,按照上面說的后,其實不用不用再編譯整個spring的項目了,直接run即可,那么就出現了: