[英]Strange behaviour when using custom remote repositories in Maven
我只是想了解使用Maven定制遠程存儲庫背后的邏輯。 在一個實驗中(在OS X中,使用命令行)我在這樣的POM中聲明一個遠程存儲庫:(實際上並不是真正的遠程,因為我使用的是file:/// ...):
<repositories>
<repository>
<id>myRepository</id>
<url>file:///test_mvrepository/repository</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
這個POM還聲明了某個工件X(在我的例子中是JPL庫)的依賴,它只存在於'remote'存儲庫中,而不存在於本地存儲庫中:
<dependencies>
<dependency>
<groupId>jpl</groupId>
<artifactId>jpl</artifactId>
<version>[3.1.4-alpha,]</version>
</dependency>
...
</dependencies>
當我執行這個:
mvn package
該項目僅按預期建造一次 。 如果我重復該操作,將會收到一條消息,指示無法訪問我的工件X:
[ERROR] Failed to execute goal on project projectname: Could not resolve dependencies for project groupid:artifactid:jar:0.0.1-SNAPSHOT: Could not find artifact jpl:jpl:jar:3.1.4-alpha -> [Help 1]
這是完整的POM:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>0.0.1-SNAPSHOT</version>
<repositories>
<repository>
<id>repId</id>
<url>file:///test_mvrepository/repository</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>jpl</groupId>
<artifactId>jpl</artifactId>
<version>[3.1.4-alpha,]</version>
</dependency>
...
</dependencies>
</project>
經過一些調試后我發現,雖然我沒有安裝帶有mvn install
install的POM,但是工件X位於本地存儲庫(它的POM,jar和其他文件)中。 僅當我從本地存儲庫中刪除條目時,才可以再次重復該操作而不會收到錯誤消息。 實際上,我不必刪除本地存儲庫中的所有條目,只需刪除文件maven-metadata-local.xml
。 這是這個文件的樣子:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>jpl</groupId>
<artifactId>jpl</artifactId>
<versioning>
<release>3.1.4-alpha</release>
<versions>
<version>3.1.4-alpha</version>
</versions>
<lastUpdated>20111214230431</lastUpdated>
</versioning>
在我的遠程存儲庫中,該文件稱為maven-metadata.xml
。
最后,如果我輸入
mvn install
然后,X始終可以按預期訪問,而不僅僅像前一種情況一樣。
我不明白這個邏輯。 為什么我不能讓Maven在這個環境中多次打包我的神器? 對我來說,很明顯,如果我不將其安裝在本地存儲庫中,那么它應該一次又一次地到達遠程存儲庫。 或者至少,它應該以一種我以后可以引用它們的方式在本地存儲庫中安裝必要的對象,而不是阻止所有將來的package
請求,直到我手動刪除該條目? 這是Maven中的錯誤嗎? 感謝您的澄清!
更新:如果它很重要,這就是我構建測試場景的方式:
我在本地存儲庫中安裝了JPL庫(它的依賴關系給我帶來了麻煩)。 我用以下命令做到了:
mvn install:安裝文件-Dfile = jpl.jar -DgroupId = jpl -DartifactId = jpl -Dversion = 3.1.4-alpha -Dpackaging = jar
我將本地存儲庫復制到文件系統中的新位置(我的“遠程”存儲庫),在這個新位置,我將JPL條目的maven-metadata-local.xml
的名稱更改為maven-metadata.xml
,如此處所述: http : //www.javaworld.com/community/node/3968 。
我從本地存儲庫中刪除了JPL條目。
如果要創建一個用於存儲工件的遠程存儲庫,則必須使用deploy
階段而不是install
階段將工件上載到該資源庫。
install
階段{USER.HOME}/.m2/
工件上傳到local
存儲庫,默認情況下,該存儲庫位於~/.m2/
或{USER.HOME}/.m2/
下。 您的本地存儲庫只是遠程存儲庫的緩存。
deploy
階段使用pom文件中提供的distributionManagement
信息將工件部署到遠程存儲庫。 您可以這樣創建您的distributionManagement定義:
<distributionManagement>
<repository>
<id>SomeId</id>
<name>SomeName</name>
<url>file:///test_mvrepository/repository</url>
</repository>
</distributionManagement>
有關分發管理的更多參考,可以訪問此站點 。
由於您已經在repositories
定義中擁有對遠程存儲庫的引用,因此當您將工件一次部署到遠程存儲庫時,將在以后的構建中將其提取並緩存到本地存儲庫中。
您可以考慮閱讀有關存儲庫和Maven生命周期信息的更多信息。 在SO上也有一些類似的問題在這里和這里都得到了很好的回答。
mvn install
將當前項目添加到本地存儲庫。 調用任何 Maven目標或階段時,依賴關系都緩存在本地存儲庫中。 因此,無論您使用哪個階段,您總是希望X最終在本地存儲庫中。
但是,您看到的行為很奇怪。 文件權限是否存在問題? 您能否將第二次運行mvn package
時得到的確切錯誤更新為該帖子?
編輯
好吧我懷疑m2e發生了一些奇怪的事情。 使用命令行時會發生這種現象嗎?
您可以嘗試將復制依賴插件綁定到包嗎? 那應該防止m2e在Eclipse中做奇怪的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.