記 Maven 本地倉庫埋坑之依賴包為何不能用


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

背景

某 Java 后端項目使用 maven 構建,因為某些原因,某些依賴庫下載不了,直接找其它人索要了他電腦上的 maven 本地倉庫里的依賴包。

然后直接拷貝到我電腦的本地 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 倉庫有本地倉庫、鏡像倉庫、倉庫中心之說。

除了本地倉庫,其他都位於遠程服務器上,如果遠程倉庫里確實沒有我們需要的依賴包,那自然就下載不了,這點可以理解。

但為什么明明我們已經從其他地方拿到依賴包,把它放到本地倉庫里了,為何構建項目時,不直接去本地倉庫里拿依賴包呢?

可能你會覺得是不是 idea 的問題,相信你也嘗試過設置 idea 的 maven 相關配置,比如開啟 offline 模式、設置本地倉庫地址、配置文件,甚至去 maven 的配置文件中修改各種配置項。

可能你會覺得是不是 idea 緩存了項目的配置問題,然后去重啟 idea,去刪除 .idea 文件,去重新 import 項目。

但最后,問題還是一樣,還是報找不到依賴包錯誤。

明明你的同事也是將依賴包放到本地而已啊,明明你的依賴包就是從同事那里拷過來的,為何他項目可以成功構建,而你的不行呢?

原因其實我也不知道,而且因為異常信息過少,網絡上搜索類似 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM