1.概述
部門內用Nexus搭建Maven倉庫,倉庫中除了有配置阿里雲倉庫代理和中央倉庫代理,也有部門自己封裝的crmd平台jar包。
總體依賴傳遞為 spring-boot(官方) --> base-parent(crmd平台包) --> platform-parent(crmd平台包)
--> app-parent(crmd平台包) --> 應用代碼,平台的jar包在中間做了一些封裝和優化,比如統一spring boot等版本號,部門所有的應用的引用的spring boot版本號一致,便於查詢問題。
1).把crmd的包下載到本地倉庫后,調整base-parent.pom的倉庫地址,用JFrog Artifactory的倉庫地址,替換Nexus的倉庫地址。
2).本地的settings.xml中,用JFrog Artifactory的倉庫地址,替換Nexus的倉庫地址。
3)。mvn install 報了一堆的錯誤,嚇死寶寶
2.問題一 報錯缺少plugin插件
2.1.報錯信息
具體報錯截取信息如下:
[WARNING] The POM for org.apache.maven.plugins:maven-site-plugin:jar:3.8.2 is missing, no dependency information available
[WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-site-plugin:3.8.2: Plugin org.apache.maven.plugins:maven-site-plugin:3.8.2 or one of its dependencies could not be resolved: Failure to find org.apache.maven.plugins:maven-site-plugin:jar:3.8.2 in http://192.168.1.193:8080/artifactory/group_public_maven/ was cached in the local repository, resolution will not be reattempted until the update interval of group_public_maven has elapsed or updates are forced
2.2.分析思路
從報錯信息可以看到,是由於在中央倉庫下載插件的時候報錯,所以檢查中央倉庫是否有相關插件。
從http://192.168.1.193:8080/artifactory/group_public_maven 中央倉庫,搜索相關插件,確實沒找到。
后來對照Nexus的中央倉庫配置,發現有個2個中央倉庫地址沒配置到jfrog。
https://repo1.maven.org/maven2/
https://maven.aliyun.com/nexus/content/groups/public
https://maven.aliyun.com/nexus/content/groups/public
2.3 解決方案
將這2個地址配置到中央倉庫組后,再次install,以上報錯消失,問題解決
3.問題二 報錯[FATAL] The parents form a cycle
3.1.報錯信息
具體報錯截取信息如下:
[WARNING] The POM for com.xzy.crmd.platform:crmd-platform-base:jar:2.1.0-20200108.084048-1 is invalid, transitive dependencies (if any) will not be available: 3 problems were encountered while building the effective model for com.xzy.crmd.platform:crmd-platform-base:[unknown-version]
[ERROR] Invalid packaging for parent POM com.xzy.crmd.platform:crmd-platform-base:[unknown-version], must be "pom" but is "jar" @
[ERROR] Invalid packaging for parent POM com.xzy.crmd.platform:crmd-platform-base:[unknown-version], must be "pom" but is "jar" @
[FATAL] The parents form a cycle: com.xzy.crmd.platform:crmd-platform-base:2.1.0-SNAPSHOT -> com.xzy.crmd.platform:crmd-platform-base:2.1.0-SNAPSHOT @
3.2.分析思路
用mvn install,是可以正常編譯,但是在運行的時候報缺少jar包,經過比對lib目錄的jar包,發現是編譯的時候,部分jar包沒自動打包進來。
mvn dependency:tree命令,查看依賴,發現有個warning:xxx
is invalid, transitive dependencies (if any) will not be available,不是很明顯,無法定位問題。
mvn dependency:tree -X命令,顯示更多錯誤信息,如3.1
分析錯誤日志,同時有fatal和error,先看fatal,是說
crmd-platform-base:2.1.0-SNAPSHOT.pom存在
The parents form a cycle
(大概是 父級節點存在循環依賴)。
於是查看本地倉庫的crmd-platform-base:2.1.0-SNAPSHOT.pom,發現本級pom的artifactId與parent的artifactId一致,定位出是pom有問題,原來是上傳jar的時候,選擇自動選擇生成pom,結果生成的pom有問題
<parent>
<groupId>com.xzy.crmd.platform</groupId>
<artifactId>crmd-platform-base</artifactId>
<version>2.1.0-SNAPSHOT</version>
</parent>
<artifactId>crmd-platform-base</artifactId>
3.3.解決方案
調整手動上傳jar方法,一次上傳的時候,同時選擇jar和pom文件,重新mvn dependency:tree -X,問題解決。



4.總結
解決maven問題,要先對maven的依賴傳遞有了解。
倉庫搜索順序如下:local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > settings_mirror > central
父級pom的dependencyManagement里面的jar,你直接在子級工程中寫<parent>標簽是沒有用的,不會自動引入的,
還要重寫一下<groupId> ,<artifactId>。
父級pom的直接dependencies里面的jar,你直接在子級工程中寫<parent>標簽,就自動引入的。
分析錯誤日志,同時有fatal和error,先看fatal