編譯Spring原始碼的步驟及一些問題
步驟
下載對應工具
1.下載gradle,使用下載好的gradle進行編譯,不需要太新,但是版本一定要匹配(好像沒碰到版本衝突問題,注意一下就得了)。
gradle網址:https://services.gradle.org/distributions/
下載好後記得配置環境變數
方式一:
1.新增環境變數GRADLE_HOME->檔案安裝目錄
2.配置Path新增%GRADLE_HOME%bin
即可
方式二:
直接在path新增下載好的gradle的bin目錄
即可。
環境變數截圖
通過gradle -v
命令測試環境變數是否配置好
2.IDEA安裝kotlin,只需要在setting->plugins
搜尋這個外掛下載安裝在重啟IDEA即可。
3.下載Spring原始碼
下載地址: https://github.com/spring-projects/spring-framework/tree/5.0.x
編譯部分
1.進入到下載好的原始碼目錄,通過命令列cmd去執行gradlew.bat命令
。我試了直接點gradlew.bat命令,但是最後編譯完成就消失了,也不知道結果是成功還是失敗。
這裡碰到了編譯失敗的問題,後面統一說明BUG問題。
執行完後會提示BUILD SUCCESSFUL
,即表示成功。
補充說明
這裡補充一下,下載好的Spring原始碼中有import-into-idea.md
這個檔案,裡面有一些說明。
譯文(推薦用有道翻譯):
總結就是:
1.先編譯那兩個基底包
2.aspects可能會有錯,可以在build.gradle檔案
說將其排除掉
3.有一些測試的問題需要調整引數
4.必須通過命令來測試某個模組
在執行完gradle.bat
命令後,我就直接做了1和4
。直到可以跑通原始碼也沒做2和3
。所以在過程中可能出現比較多的問題吧。
結果圖:
2.匯入IDEA
這個就直接匯入即可,然後他就會自動下載。
我找網上的資料,都是說匯入的時候讓你對gradle專案進行一些設定。但是不管我用什麼方式匯入
,都沒有設定的選項。
所以我在把專案匯入IDEA後先手動停止他下載依賴,我進行了一些配置在重新重新整理。
修改配置圖:
重新下載依賴:
這裡需要一定的時間,所以耐心等待。建議在網路較好的環境下進行,避免不必要的問題(超時等等)
最後下載成功:
測試
1.在Spring-context
模組中,通過自己的方式建立上下文,我使用的是註解。
2.編寫一個實體類和啟動程式,啟動程式中建立Spring容器並獲取對應實體bean物件。
補充說明
可以通過寫註釋,打斷點的方式看是否跳到對應的程式碼行
。
需要注意,修改完註釋後需要重新編譯(執行右邊gradle下的build中的jar命令),這樣才能保證修改的註釋生效。(因為編譯後的是class位元組碼檔案,我們在後面也是引入是位元組碼檔案,在java程式碼編寫完後重新打包編譯生成位元組碼後,新的註釋才能生效)
其他工程引入自己編譯的原始碼
編譯自己的Spring原始碼肯定是想要在自己的Demo工程中去進行引入測試,看看其執行流程或者是程式碼如何編寫的。
但是直接從maven下載的都是read-only
的,不能在上面寫一些自己理解的註釋,所以才匯入了自己編譯的Spring原始碼。
匯入過程:
進入專案環境
選擇library:
先引入執行的位元組碼檔案:
然後引入source資源目錄:
最後,我移除了maven下載的官方包
最終結果:
其他涉及到的模組也類似這樣處理。
補充問題
這裡需要說明一下,對於引入位元組碼和source我是這樣理解的。
引入class位元組碼
只是告訴JVM執行的時候位元組碼檔案在哪,在執行的時候你只需要載入我對應目錄的位元組碼檔案去執行就可以了。
而進入source資源
只是為了我們點進原始碼中,能看到原始碼,並在原始碼上新增屬於自己的註釋。
所以,當我們修改原始碼註釋的時候,需要重新編譯打包成位元組碼檔案,新的位元組碼檔案就會替換掉舊的。JVM在執行載入的時候才能顯出我們新修改過後的原始碼。
這樣就避免了修改了註釋,重新DEBUG的時候直接跳過斷點的問題。
碰到的問題
最主要的問題是gradle編譯
和使用IDEA引入下載依賴
這裡我兩者都會出Build Fail
。
報的錯就是Could not resolv xxx.jar
,Could not get https://abc.123xyz.com/xxx.jar
大概就是一些無法下載編譯包的問題。這裡也找了很長時間,確實是一個大坑。
這塊的話我主要是新增倉庫來源來解決他:
增加了google()
和jcenter()
。還有一些例如hibernate-validator
下載不下來,我直接去maven倉庫找到其下載路徑,單獨引入進來。
引入到倉庫後,在dependencies
塊中也要新增complie xxxx
標識,具體從maven倉庫中賦值。
強烈建議:在使用命令列編譯的時候就修改build.gradle中的倉庫映象,這樣能大大加快速度並且減少不必要的報錯
maven倉庫地址:https://mvnrepository.com/
其他的問題:
其他的問題我是沒碰到,但是其他小夥伴好像出現了版本不匹配,編譯出錯的情況。
這一塊的話,好像是不能太高的版本,也不能太低,包括JVM,Gradle,Kotlin
這裡我Kotlin沒有修改過,JDK是1.8的環境,Gradle是4.3.1,編譯的Spring是5.0.2 RELEASE。
但是,最終在執行的時候報了一個錯。
是某一個類實現的介面的方法不全,我通過alt+enter
直接將其完成了一個空實現,最後程式能正常跑通。
關於這一塊,以後在碰到的時候在進行處理,畢竟走了一下簡單的時序流程,發現沒有什麼太大的問題。主要功能好像也沒受到影響,所以就不在細去解決這個空方法的問題,畢竟原始碼這個東西也不是說一天兩天就搞得明白的,況且也不需要對原始碼的每一行都進行理解。
小結
這塊我自己是一波三折,找了很多文章和解決辦法終於是把他解決了。
最主要的是一定要在網路條件較好的情況下進行
,我自己是出現了幾次time out的情況,浪費了一些時間。
在編譯的過程中,耐心等待即可,因為涉及到的依賴包實在是太多了。
最重要的是解決辦法的思路,也不能一股腦的就複製貼上到百度,提煉一下關鍵點。
我在處理下載依賴下不下來的時候,我也是後面才慢慢想到是倉庫源的問題,然後又牽扯到maven倉庫。
畢竟之前一直都是用maven,想到maven可以直接把東西下好放到對應的本地倉庫地址中去,然後IDEA在下載的時候會先檢查本地,這時我通過手動已經下載並複製進去了,那麼IDEA就檢查到了。
類比到Gradle,找到倉庫下載源,新增到repositories
中去,果然就download下來了。
過程中也參考了一些夥伴的文章,提供了不少的思路:
https://blog.csdn.net/qq_35576976/article/details/105616432?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control
https://blog.csdn.net/m0_37615458/article/details/103804927
https://blog.csdn.net/weixin_43286186/article/details/96479324
相關文章
- Spring原始碼編譯Spring原始碼編譯
- openwifi編譯步驟記錄WiFi編譯
- openssl原始碼編譯及配置方法原始碼編譯
- 記錄一些工程編譯問題編譯
- Django3.2安裝原始碼xadmin2步驟以及遇到的問題Django原始碼
- 配置pycharm 編譯器時遇到的一些問題PyCharm編譯
- Flutter-安裝步驟及安裝遇到的問題Flutter
- Spring 6 原始碼編譯和高效閱讀原始碼技巧分享Spring原始碼編譯
- Linux系統下編譯Openssl 步驟:Linux編譯
- Gradle 編譯警告亂碼問題Gradle編譯
- JVM問題排查步驟JVM
- Spring原始碼學習01:IntelliJ IDEA2019.3編譯Spring5.3.x原始碼Spring原始碼IntelliJIdea編譯
- Linux中程式包管理及程式的原始碼編譯Linux原始碼編譯
- 陪玩系統原始碼實現音訊編碼的相關步驟原始碼音訊
- CDH impala for Apache HADOOP 安裝編譯步驟.ApacheHadoop編譯
- java筆記2-java編譯步驟Java筆記編譯
- Kubernetes原始碼編譯原始碼編譯
- Linux下編譯安裝Mysql 5.5的簡單步驟Linux編譯MySql
- ambari+ bigtop 編譯、打包、部署步驟總覽編譯
- doris編譯和安裝部署詳細步驟編譯
- libmemcached編譯問題IBM編譯
- SPI編譯問題編譯
- React的零渲染問題及原始碼分析React原始碼
- cesium原始碼編譯除錯及呼叫全過程原始碼編譯除錯
- ZXing原始碼解析二:掌握解碼步驟原始碼
- 修改gradle指令碼,加速spring4.1原始碼編譯構建速度Gradle指令碼Spring原始碼編譯
- 原始碼編譯安裝的原理原始碼編譯
- 原始碼編譯Vim 8原始碼編譯
- MongoDB(0)- 原始碼編譯MongoDB原始碼編譯
- XCode 編譯 PAG 原始碼XCode編譯原始碼
- Docker編譯Azerothcore原始碼Docker編譯原始碼
- 【問題記錄】—.NetCore 編譯問題NetCore編譯
- go的編譯優化問題Go編譯優化
- nginx 編譯出現的問題Nginx編譯
- Spring事務原始碼分析專題(一)JdbcTemplate使用及原始碼分析Spring原始碼JDBC
- 程式碼線上編譯器(上)- 編輯及編譯編譯
- zabbix3.4原始碼安裝步驟原始碼
- 2018年後 OpenWrt原始碼下載及韌體編譯原始碼編譯