環境:maven專案,使用Nexus私服(ip:192.168.10.100),jenkins實現程式碼的編譯和打包。
問題分析思路:在2021年元旦假期前,jenkins上的編譯打包任務一直正常工作,但假期後突然所有專案都編譯失敗,報錯很一致都是Could not find artifact ******;分析問題前後可能導致問題的變更,以便定位問題
1. 所有專案都出現問題,且gitlab上未發現程式碼,特別是pom.xml檔案的提交記錄,可以排除程式碼問題
2. 分析編譯環境maven相關設定,鑑於問題前後都是用的同一個映象,可以排除編譯環境maven配置錯誤的可能
3. 目前確定的變化就是時間,猜測是否2021年->2022年時間的變化觸發了nexus私服觸發了某些清除策略或機制,需要詳細分析具體Could not find artifact的包
4. 分析編譯過程download的記錄日誌,發現大量路徑類似 Downloaded: http://192.168.10.100:8080/repository/public/,由此分析訪問私服網路是沒有問題的。
5. 檢視日誌詳細分析未找到的依賴
Downloaded: http://192.168.10.100:8081/repository/public/io/reactivex/rxjava2/rxjava/2.2.19/rxjava-2.2.19.jar (2301 KB at 18115.6 KB/sec) Downloading: http://maven.aliyun.com/nexus/content/groups/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/project-mqtt-api-dev-9-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] gridnt-common ...................................... SUCCESS [ 2.207 s] [INFO] gridnt-dao ......................................... FAILURE [ 7.685 s] [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 02:36 min [INFO] Finished at: 2022-01-04T08:07:31+00:00 [INFO] Final Memory: 104M/440M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal on project gridnt-dao: Could not resolve dependencies for project com.gridnt:gridnt-dao:jar:3.1.0: The following artifacts could not be resolved: com.gridnt:project-mqtt-api:jar:dev-9-SNAPSHOT:
Could not find artifact com.gridnt:project-mqtt-api:jar:dev-9-SNAPSHOT in gridnt_repo (http://192.168.10.100:8081/repository/public) -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException [ERROR] After correcting the problems, you can resume the build with the command [ERROR] mvn <goals> -rf :gridnt-dao
日誌中的關鍵資訊已使用紅字標出,含義表達很清晰,在私服倉庫中沒有這個jar包project-mqtt-api-dev-9-SNAPSHOT.jar。
根據日誌中的提示資訊,手動構造一下私服上project-mqtt-api-dev-9-SNAPSHOT.jar的訪問路徑:
Downloaded: http://192.168.10.100:8081/repository/public/io/reactivex/rxjava2/rxjava/2.2.19/rxjava-2.2.19.jar (2301 KB at 18115.6 KB/sec) Downloading: http://maven.aliyun.com/nexus/content/groups/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/project-mqtt-api-dev-9-SNAPSHOT.jar
理論上應該是http://192.168.10.100:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/project-mqtt-api-dev-9-SNAPSHOT.jar
開啟瀏覽器,登入nexus私服,訪問上述url,結果返回404,表示該jar在私服上不存在
直接在私服上查詢,結果可以查詢到
此處要注意:我想要下載的【project-mqtt-api-dev-9-SNAPSHOT.jar】,私服上的jar是帶有有時間戳【dev-9-SNAPSHOT/project-mqtt-api-dev-9-20220104.093145-1.jar】熟悉maven私服snapshot機制的人到這裡基本就找到問題根源了,可惜我對此不是很瞭解,所以饒了彎路。
6.【彎路,可跳過】以為上述jar包名字沒有時間戳也是正確的,走上了錯誤排查路;因為不是所有私服上的jar都找不到,又先入為主覺得是受時間影響導致大jar包下載失敗,所以就歸納分析所有下載失敗的jar是否都是update比較早的包,但實際時間上並不存在共性,說明分析方向錯誤
7. 受同事啟發,發現所有下載失敗的包都是snapshots倉庫的包,release倉庫的包沒有問題;檢查pom.xml配置中私服地址對應倉庫組中是否未配置snapshots,實際已配置;調整snapshots倉庫順序,優先查詢snapshots倉庫,結果問題仍存在。
8. 對比snapshots倉庫和release倉庫設定,發現snapshots有清除策略(如下圖),但release沒有,因此懷疑是清除策略導致的問題
9. 網上漫搜的過程中突然有人提到使用清除策略後,會導致maven-metadata.xml丟失,然後依賴包下載失敗,日誌和我的問題類似
10. 返回檢視日誌,發現project-mqtt-api相關的下載有三個,依次為maven-metadata.xml、*.pom、jar包;對比之前打包成功的日誌
-----編譯時下載依賴包成功日誌
Downloading: http://192.168.10.100:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/maven-metadata.xml
... Downloaded: http://192.168.10.100:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/maven-metadata.xml (2 KB at 36.9 KB/sec) Downloading: http://192.168.10.100:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/project-mqtt-api-dev-9-20210604.101653-19.pom 2/2 KB Downloaded: http://192.168.10.100:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/project-mqtt-api-dev-9-20210604.101653-19.pom (2 KB at 78.8 KB/sec) Downloading: http://192.168.10.100:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/project-mqtt-api-dev-9-20210604.101653-19.jar 360/373 KB 67/67 KB 496/1661 KB 76/121 KB
..... Downloaded: http://192.168.10.100:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/project-mqtt-api-dev-9-20210604.101653-19.jar (13 KB at 229.7 KB/sec)
----------編譯時下載依賴包失敗日誌
Downloading: http://192.168.8.205:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/maven-metadata.xml ....... Downloading: http://192.168.8.205:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/project-mqtt-api-dev-9-SNAPSHOT.pom ........ [WARNING] The POM for com.gridnt:project-mqtt-api:jar:dev-9-SNAPSHOT is missing, no dependency information available Downloading: http://192.168.8.205:8081/repository/public/com/gridnt/project-mqtt-api/dev-9-SNAPSHOT/project-mqtt-api-dev-9-SNAPSHOT.jar [ERROR] Failed to execute goal on project gridnt-dao: Could not resolve dependencies for project com.gridnt:gridnt-dao:jar:3.1.0: The following artifacts could not be resolved: com.gridnt:project-mqtt-api:jar:dev-9-SNAPSHOT:
Could not find artifact com.gridnt:project-mqtt-api:jar:dev-9-SNAPSHOT in gridnt_repo (http://192.168.8.205:8081/repository/public) -> [Help 1]
對比兩個日誌發現:
1)下載依賴包需要依次下載3個問題
2)下載失敗從maven-metadata.xml下載失敗開始產生的,而不只是缺少jar包,需要研究下maven-metadata.xml
3)成功下載和失敗下載對比,.pom和.jar檔案的檔名多了一串數字,看起來像時間戳;結合第5步和第6步分析,我們下載依賴jar包失敗是因為路徑錯誤,檔名寫錯了。
11. 研究發現maven-metadata.xml檔案通過記錄時間戳管理snapshots倉庫的版本資訊,之前jar和pom檔名稱字尾部分的數字就取自maven-metadata.xml檔案中的時間戳欄位。
此時問題根本在為什麼下載maven-metadata.xml失敗。根據url訪問返回404,該檔案不存在。
在nexus下手動檢視如下圖,未找到maven-metadata.xml檔案
12. 解決方案
1)記錄上圖右下角的資訊
<dependency> <groupId>com.gridnt</groupId> <artifactId>project-mqtt-api</artifactId> <version>dev-9-20220104.093145-1</version> </dependency>
2)登入nexus,建立Rebuild Maven Metadata Files任務(此圖中已完成建立)
3) 新建任務後,Run執行任務,然後重新整理snapshots倉庫樹結構頁面,發現maven-metadata.xml檔案有了,且記錄的時間戳與目錄下jar和pom檔名中的時間戳一致。再去執行編譯任務下載依賴包成功了。
把所有編譯時下載失敗的jar都執行任務Rebuild Maven Metadata Files。問題解決了。
總結:遇到問題,最好的定位解決途徑就是仔細分析報錯日誌!
最好的定位解決途徑就是仔細分析報錯日誌!
最好的定位解決途徑就是仔細分析報錯日誌!
重要的事情說三遍!
遺留問題:為什麼會過一個假期就出現maven-metadata.xml檔案丟失的情況,沒找到原因,有知道的小夥伴歡迎給我留言