環境: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文件丟失的情況,沒找到原因,有知道的小伙伴歡迎給我留言