[英]Maven dependency not getting corresponding POM file downloaded
我有一個maven項目,它具有從遠程Nexus存儲庫獲取的依賴項。 我相信依賴關系不是用maven構建的,只是上傳了一個准系統POM文件。 服務器上的布局看起來很好,所以它可能與maven一起部署。
當maven將依賴項下載到我的本地存儲庫時,它會下載jar文件,但不會獲得POM。 在構建時,會發出警告,指出無法找到POM,並且沒有可用的依賴項信息。 我實際上並沒有直接使用它的任何代碼(它實際上是一個傳遞依賴),因此構建成功完成。
當我嘗試為我的項目執行站點生成時,會出現真正的問題。 嘗試生成依賴關系圖報告的部分失敗,因為它無法找到要使用此依賴關系的POM。
我無法弄清楚為什么我沒有下載POM,當它的jar文件下載得很好。
該特定依賴項的POM文件看起來像這樣(你可以看到為什么我不認為它是用maven構建的:))
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.component</groupId>
<artifactId>my-artifact</artifactId>
<version>1.0.1</version>
</project>
您會注意到根<project>
元素不包含任何命名空間或架構信息。 這有關系嗎? 難道Nexus不承認它是POM嗎? 除了一些小的句法字符丟失或錯誤的可能性,這是我目前的思路......請不要讓它影響你可能有的任何想法! :)
此外,在進行故障排除時,我已將遠程POM文件的內容粘貼到我本地.m2 repo中的正確文件位置。 當我這樣做時,一切都很好。 但這不是一個可接受的修復,因為我們需要在我們的CI構建服務器上完成構建。
任何幫助/建議非常感謝!
編輯:
我設法暫時解決了我的實際問題,但這里的陌生感仍然存在。 我通過從我的pom中的依賴項顯式排除依賴於此的東西解決了這個問題(故障dep至少是兩步之遙,我沒有使用任何使用拉動它的東西):
<dependency>
<groupId>com.company.utility</groupId>
<artifactId>shared-utility</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>com.company.common.component</groupId>
<artifactId>thing-that-puls-in-bad-artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
我用以下POM創建了一個虛擬項目來證明它:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.project</groupId>
<artifactId>my-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.company.component</groupId>
<artifactId>bad-artifact</artifactId>
<version>1.0.1</version>
</dependency>
</dependencies>
</project>
現在在~/.m2/repository/com/company/compnent/bad-artifact/1.0.1/
,我得到了:
_remote.repositories
bad-artifact-1.0.1.jar
bad-artifact-1.0.1.jar.sha1
bad-artifact-1.0.1.pom.lastUpdated
沒有實際的POM文件。
如果您查看_remote.repositories
,那么此文件可能包含“上次下載POM失敗,請勿再次嘗試”的信息。
這是Maven的政策“不再嘗試下載版本”的事情之一。 嘗試刪除文件夾~/.m2/repository/com/company/compnent/bad-artifact/1.0.1/
並再次運行Maven以查看錯誤。
Maven很可能拒絕使用這樣一個破碎的POM,因為根元素沒有正確的XML命名空間。 但是如果沒有看到實際的錯誤信息,很難說清楚。
解決此問題的方法是下載JAR並從命令行使用mvn install:install-file
在本地安裝依賴項。 更好的是,您可以使用mvn deploy:deploy-file
將其部署到您自己的Nexus服務器上,這樣所有其他開發人員現在都可以獲得POM的“好”版本。
您還應該與運行遠程Nexus服務器的人員聯系,以便他們可以解決問題。
與您的實際問題無關,但是使用maven(至少是最新版本),生成的jar在該jar的META-INF/maven
文件夾中包含它們的pom.xml
。
您應該嘗試使用-e -X
運行maven,並移動本地存儲庫以強制Maven 再次下載all。
mv "~/.m2/repository" "~/.m2/repository.old"
mvn -X -e dependency:tree
[編輯]它最初是一個評論,但它會太長:
據我了解你的問題,我認為這是Nexus的錯誤,而不是你的機器上。 任何有效的解決方案都需要你弄亂你的公司Nexus。 如果您無權對公司Nexus執行任何操作,則可以使用本地Nexus進行測試。
您還可以在~/.m2/settings.xml
強制使用該Nexus,如下所示:
<mirrors>
<mirror>
<id>nexus-local-central</id>
<mirrorOf>central</mirrorOf>
<url>http://localhost:8081/nexus/content/repositories/central</url>
</mirror>
<mirror>
<id>nexus-local-any</id>
<mirrorOf>external:*</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public</url>
</mirror>
</mirrors>
你不應該失去太多時間來解決它失敗的原因,而應該專注於讓它發揮作用。
為此,我認為你應該為該工件編寫一個有效的pom.xml,並使用pomFile選項在服務器上重新部署它:
mvn deploy:deploy-file -DpomFile=valid-pom.xml -Dfile=foobar.jar -Durl=http://nexus:8081 -DrepositoryId=company-nexus-deploy
或者,如果您太懶(或者如果此命令失敗),請從Nexus GUI執行此操作!
PS:Nexus的默認管理員登錄名/密碼是admin/admin123
,我認為還有deploy/deploy123
用於部署。 我見過的大多數Nexus都沒有配置為使用其他登錄名/密碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.