記 Maven 本地倉庫埋坑之依賴包爲什麼不能用

記一次 Maven 本地倉庫埋坑之 Verifying Availability

背景

某 Java 後端項目使用 maven 構建,由於某些緣由,某些依賴庫下載不了,直接找其它人索要了他電腦上的 maven 本地倉庫裏的依賴包。web

而後直接拷貝到我電腦的本地 maven 倉庫裏,但構建項目時,發現,仍舊報找不到依賴包也下載不了的錯誤,致使項目構建不起來。後端

異常信息

以上是背景,下面是構建過程出現的一些異常:緩存

  • The Pom for xxx.jar is missing, no dependency information available
[WARNING] The POM for xxx:jar:5.1-RELEASE is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.992 s
[INFO] Finished at: 2019-11-09T13:21:15+08:00
[INFO] Final Memory: 15M/300M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project xxx-app: Could not resolve dependencies for project xxx: Failure to find xxx:jar:5.1-RELEASE in http://maven.aliyun.com/nexus/content/groups/public was cached in the local repository, resolution will not be reattempted until the update interval of nexus-aliyun has elapsed or updates are forced -> [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]

分析

咱們知道,maven 倉庫有本地倉庫、鏡像倉庫、倉庫中心之說。服務器

除了本地倉庫,其餘都位於遠程服務器上,若是遠程倉庫裏確實沒有咱們須要的依賴包,那天然就下載不了,這點能夠理解。網絡

但爲何明明咱們已經從其餘地方拿到依賴包,把它放到本地倉庫裏了,爲什麼構建項目時,不直接去本地倉庫裏拿依賴包呢?app

可能你會以爲是否是 idea 的問題,相信你也嘗試過設置 idea 的 maven 相關配置,好比開啓 offline 模式、設置本地倉庫地址、配置文件,甚至去 maven 的配置文件中修改各類配置項。maven

可能你會以爲是否是 idea 緩存了項目的配置問題,而後去重啓 idea,去刪除 .idea 文件,去從新 import 項目。ide

但最後,問題仍是同樣,仍是報找不到依賴包錯誤。idea

明明你的同事也是將依賴包放到本地而已啊,明明你的依賴包就是從同事那裏拷過來的,爲什麼他項目能夠成功構建,而你的不行呢?.net

緣由其實我也不知道,並且由於異常信息過少,網絡上搜索相似 maven 本地依賴包不起做用之類的關鍵詞,也仍舊找不到解決方案。

後來,爲了知道更多異常信息,參考上面異常時給出的建議,在執行構建命令時,帶上了 -e -X 參數:

[DEBUG] Verifying availability of C:\Users\suxq\.m2\repository\com\xxx\5.1-RELEASE\xxx-5.1-RELEASE.pom from [nexus-aliyun (http://maven.aliyun.com/nexus/content/groups/public, default, releases+snapshots)]

[WARNING] The POM for com.chinanetcenter.light:web:jar:5.1-RELEASE is missing, no dependency information available

看來,構建過程,確實會先去本地讀取依賴包,從上面那個 Verifying availability ... 日誌就能夠看出。

這條日誌說明會去本地 maven 倉庫驗證依賴包是否可用。

那麼關鍵就在於,驗證本地依賴包是否可用的依據究竟是什麼呢?

從整條日誌的意思中能夠大概猜想,它應該是去遠程倉庫中讀取依賴包的信息來跟本地的進行驗證,畢竟日誌上有一個 from,很難不讓人這麼猜想。

那若是真是這樣,這裏的驗證確定就通不過了,由於遠程倉庫裏並無這幾個依賴包(由於某些緣由)。

而後,我在網絡上搜索了 Verifying availability 關鍵詞,找到了這麼一篇:

maven建立離線本地倉庫的坑之verifying availability

文章裏說了,將本地倉庫的依賴包目錄下的 **__remote.repositories** 文件刪掉,本地依賴包就能夠正常使用了,嘗試了下,確實可行,搞定!

好奇之下,搜索了相關資源,找到這些一些文章:

maven倉庫中的LastUpdated文件生成緣由及刪除

使用Maven,即便存在*.lastUpdated文件也能更新jar文件的方法

看了下,大概就是說,maven 在下載依賴包過程當中,若是由於某些緣由沒有成功下載,那麼本地就會生成諸如 xxx.repositories 或 xxx.lastUpdated 之類的文件。

一旦本地有這些文件,那麼就意味着本地的依賴包可能不完整,須要先進行驗證是否可用,才能被使用。

那麼,如何驗證呢?天然就是再去這些臨時文件中記載的遠程倉庫從新讀取一遍依賴包的相關信息來跟本地比對,確認本地依賴包是否可用。

這也就是爲何,明明開啓了 offline 離線模式,明明從其餘人那裏拷貝了相關依賴包到本地,但構建過程卻依據須要聯網的緣由?由於你本地的依賴包裏有這些臨時文件,代表本地依賴包可能不是完整包,不能直接被使用,須要先進行驗證,天然就須要聯網了。

這也是本地有依賴包,但每次卻又去遠程倉庫,而後找不到,又報異常的緣由。

因此,結論就一點:

不是說,你本地 Maven 倉庫裏有依賴包,構建過程就能夠優先被使用,你還要確保你本地的依賴包是完整、可用的才行。

如何確認呢?就是依賴包目錄中,沒有像 xxx.repositories 或 xxx.lastUpdated 之類的文件。

若是你能確保你的本地依賴包是完整、可用的,那手動將這些文件刪掉,構建過程就不會再聯網去遠程倉庫驗證了,就能夠優先使用本地依賴包了。

解決方案

本篇的背景所遇到的文件,解決方案就一句話:

將 Maven 本地倉庫裏,找同事拷過來的那個依賴包目錄中,將 xxx.repositories 文件刪掉,再從新構建項目便可。

至於想知其因此然,看上面分析那個小節的內容便可。

注:解決這類問題時,找準關鍵詞,通常就能在網絡上找到解決方案了。


你們好,我是 dasu,歡迎關注個人公衆號(dasuAndroidTv),公衆號中有個人聯繫方式,歡迎有事沒事來嘮嗑一下,若是你以爲本篇內容有幫助到你,能夠轉載但記得要關注,要標明原文哦,謝謝支持~
dasuAndroidTv2.png

相關文章
相關標籤/搜索