maven無法下載間接依賴包

一、起因

  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的代碼,要看該版本對應私服上的代碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章