一、起因
A模塊依賴B模塊,B模塊依賴C和D模塊(C和D是其他項目中的jar);A模塊需要用到C或D中的類,通過B模塊間接依賴了C和D。此時打包A的時候報錯,大致意思是,無法編譯使用C或D中的類。
給A模塊打包,執行命令:
mvn clean install
出現以下錯誤:
Error:(8,52) java: 程序包com.demo.utils.common.response不存在
Error:(27,5) java: 找不到符號
Error:(35,5) java: 找不到符號
...
編譯報錯,熟悉的味道。。。
截圖中報紅的Error隨便找一個雙擊一下,跳轉到代碼中查看下:
尼瑪,這代碼也沒報紅啊。開始排查吧~
ps:代碼中也報紅就簡單了,那明顯就是缺少jar包,添加對應的maven依賴就行了。
注意:此時報紅的地方,都是B模塊所依賴jar中的類,即A模塊通過B模塊間接依賴的類。
二、排查
1. 仔細看錯誤提示
遇到錯誤不要慌、不要急,不要放過任何一個報錯細節!仔細看,其實會發現截圖中的一個警告
摘出來是這樣的:
The POM for com.demo:demo-common:jar:1.1.22 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
翻譯過來是:demo:demo-common:jar:1.1.22的POM無效,傳遞依賴項(如果有)不可用,請啓用調試日誌記錄以獲得更多細節。
提示很清楚,你依賴的這個common包(就是我們說的B模塊)傳遞依賴項不可用了!也就是說我們A模塊,通過B模塊間接依賴的包,都不可用了。
爲啥不可用,我們看看調試日誌吧~
2. debug模式重新install
我們進入到子模塊,使用-X參數查看debug信息,比如我剛纔打包的子模塊是client:
cd client
mvn clean install -X
搜索上面的報錯信息:The POM for com.demo:demo-common:jar:1.1.22 is invalid
很容易就能搜到,真正的錯誤信息就在你搜索的下一行,看截圖中標紅的位置。
3. 分析錯誤
當然每個人的錯誤可能不一樣,我的錯誤是com.demo.xxx:demo-xxx:jar ,意思是demo-xxx這個jar包找不到。demo-xxx這個包是B模塊依賴的包,爲什麼會提示缺失呢?
檢查B模塊的pom.xml
發現demo-xxx這個依賴,在B模塊的pom.xml中沒有配置版本!沒什麼奇怪的,那會使用父項目中定義的版本。但是父項目中定義這個依賴的版本了啊!
注意哈:B模塊不一定是使用當前代碼父模塊中的pom.xml,要看下B模塊中pom.xml定義的父模塊的版本。
所以要去maven私服中查看1.0.0這個父pom.xml中到底有沒有定義demo-xxx這個依賴的版本。
結論
:我去私服上查了下,1.0.0這個父pom.xml中,確實沒有定義demo-xxx這個依賴的版本,所以導致B模塊的pom.xml解析出錯,進而導致B模塊依賴的所有包都無法下載!最終導致install A模塊的時候報錯!
三、解決
- 方式一:在A模塊中直接依賴demo-xxx這個jar
原理:因爲A模塊直接依賴父項目,而且當前父項目的pom.xml代碼中也已經聲明瞭demo-xxx.jar的版本,所以A能直接使用。但A依賴B時不能使用,是因爲間接依賴不能使用本地pom.xml代碼,需要使用私服中真正的pom.xml! - 方式二:升級父項目的版本
在新版本的父pom.xm中聲明demo-xxx這個jar的版本,並讓B模塊使用父項目的新版本,然後A模塊依賴B項目的新版本。
四、總結
- 多注意maven報錯信息,進而使用-X參數查看debug日誌
- 無法下載間接依賴,一般是直接依賴(B模塊)的pom.xml有問題
- 不要只看本項目中pom.xml的代碼,要看該版本對應私服上的代碼。