javascript
听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译
之所以寫這么一篇文章是因為群里的小伙伴在編譯源碼時碰到了問題,再加上筆者自身正準備做一個源碼的注釋版本,恰好也需要重新編譯一份代碼,至于為什么要將源碼編譯到本地就不用多說了吧?
比如,你可以任意的添加注釋,一邊讀源碼一邊記筆記,甚至你可以修改源碼,更好的調試程序等等。但是如果你堅持通過導入依賴或者引入jar包的方式來學習源碼,我覺得也可以,沒有最好的,只有最適合自己的!
本文的主要目的是幫助那些在源碼學習之初就被源碼編譯勸退的同學重拾信心!
”話不多說,我們開始正題
參考官方文檔:
https://github.com/spring-projects/spring-framework/wiki/Build-from-Source
https://github.com/spring-projects/spring-framework/blob/master/import-into-idea.md
前期準備
確保本機已經安裝好了git
jdk對應版本為1.8
Gradle,目前不需要安裝,在編譯的時候根據源碼提示按照對應版本的Gradle即可
IDEA,我使用的版本如下:
1、獲取Spring源碼
這里我推薦使用clone的方式將源碼拉取到本地,最大的好處在于可以利用IDEA直接比較版本間的差異,例如
在上圖中我本地編譯的5.0版本的代碼,所以我對比的是5.0跟5.1版本populateBean方法實現的差異。
接下來我們開始拉取Spring源碼,大家可以按照以下幾步進行
在任意磁盤路徑下新建一個文件夾,名稱隨便取,建議為SpringFramWork
進入SpringFramWork文件夾中,打開git命令行,輸入以下命令
接著等待倉庫克隆完畢,這個過程可能會耗費比較長的時間,如果實在不行的話,大家可以直接將源碼的壓縮包down下來。
如果你是跟我一樣直接拉取的代碼,記得切換到5.2.x版本,在命令行中執行命令:
?git?checkout?origin/5.2.x2、添加阿里云鏡像
在編譯過程中,Spring會去自動下載一些依賴的包,默認使用的是官方的鏡像,下載比較慢,所以我們提前添加好國內鏡像,將下面這行代碼粘貼到build.gradle文件中的repositories節點下即可 ,
//添加阿里云鏡像 maven?{?url?"http://maven.aliyun.com/nexus/content/groups/public"?}如下圖所示
3、預先編譯spring-oxm模塊
打開命令行窗口,并切換到源碼所在文件夾,執行以下命令
gradlew?:spring-oxm:compileTestJava出現BUILD SUCCESS字樣時說明構建成功,如下圖所示
4、根據編譯后的源碼下載并安裝對應的版本的Gradle
在完成對spring-oxm模塊的編譯后,會在當前目錄生成一個.gradle文件夾,打開后可以查看對應的Gradle版本。
雙擊打開.gradle文件夾就能看到對應所需要的gradle的版本號
大家直接在這個網站上下載對應所需要的版本即可:https://gradle.org/releases/,選擇binary-only
安裝好后記得配置Gradle的環境變量
-
新增?GRADLE_HOME?環境變量,指向Gradle解壓目錄
-
配置Path環境變量:新增?%GRADLE_HOME%\bin
之后測試是否安裝成,在命令行中輸入以下命令:gradle -v,查看是否正確輸出了對應版本。
5、為安裝好的Gradle配置國內鏡像
進入Gradle安裝目錄,在init.d目錄下新建一個init.gradle文件,并添加以下內容:
allprojects{repositories?{def?REPOSITORY_URL?=?'http://maven.aliyun.com/nexus/content/groups/public/'all?{?ArtifactRepository?repo?->def?url?=?repo.url.toString()if?((repo?instanceof?MavenArtifactRepository)?&&?(url.startsWith('https://repo1.maven.org/maven2')?||?url.startsWith('https://jcenter.bintray.com')))?{project.logger.lifecycle?'Repository?${repo.url}?replaced?by?$REPOSITORY_URL?.'remove?repo}}maven?{url?REPOSITORY_URL}} }如下圖所示:
6、將代碼導入到IDEA中
6.1、打開IDEA并選擇導入項目
6.2、選擇導入一個Gradle項目
6.3、配置導入的項目
點擊Finish后等待IDEA構建完項目,如果你之前已經按照我的方法配置了Gradle的國內鏡像,這個過程不會太久,我們本機只用了10多分鐘就構建完成了
構建完成后整個項目結構如下:
如果你跟我一樣是直接檢出的代碼,記得將分支切換到5.2.x
7、構建整個項目
選擇Build > Build Project
可能出現的問題
AnnotationCacheAspect找不到符號
在這個過程中你可能會碰到如下錯誤:
這是因為AnnotationCacheAspect.aj?不是java文件需要另外的aspectj進行處理,可以按照以下步驟解決這個問題
-
下載aspectj,對應鏈接:https://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.9.5.jar
-
安裝aspectj
打開命令行,cd到AspectJ的jar包所在的文件夾,運行java -jar aspectj-1.9.4.jar命令,打開AspectJ的安裝界面,直接點擊Next,如下圖:
接著選擇jdk的安裝路徑,繼續Next。
接著選擇AspectJ的安裝路徑,然后Install安裝。
-
IDEA中配置aspectj
確保以下兩個插件已經被激活
Spring AOP/@AspectJ
AspectJ Support
將編譯器改為 Ajc,接著設置Ajc的安裝目錄,選擇到aspectjtools.jar,同時,一定要將Delegate to Javac選項打鉤,這個代理設置的作用只對指定的項目進行Ajc編譯,其他的項目還是用默認的javac編譯器編譯。如果不勾選這個代理選項,則全部項目都使用Ajc編譯器編譯,可能會導致編譯錯誤。
-
指定需要使用Ajc編譯的項目
分別為spring-aop及spring-aspects添加Facets屬性。
點擊File --> Project Structure --> Facets,選擇spring-aop.main,點擊OK
點擊File --> Project Structure --> Facets,選擇spring-aspects.main,點擊OK
完成添加,如下圖所示:
完成上述步驟后,再次選擇Build > Build Project,成功完成編譯
8、添加測試模塊
8.1、右鍵工程名 ---> new ---> module
8.2、選擇Gradle及Java
8.3、輸入模塊名稱
點擊next ---> Finish 完成測試模塊的創建
最后,添加一些必要的依賴,修改創建好的模塊中的build.gradle文件,添加如下三個依賴
compile(project(":spring-aop")) compile(project(":spring-context")) optional("org.aspectj:aspectjweaver")如下圖所示:
至此,我們就完成了整個Spring的編譯,并且在創建了一個日后學習使用的模塊!
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 再见面试官:你能说说 Spring 框架
- 下一篇: 我去,为什么最左前缀原则失效了?