[英]Maven 3 does not update snapshot dependency from local repository
我正在嘗試在我的maven項目中使用外部庫。 由於我希望項目在任何機器上開箱即用,我不想使用mvn install
解決方案。 因此我在我的pom.xml中定義了本地存儲庫:
<dependency>
<groupId>com.test</groupId>
<artifactId>fooLib</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
....
<repository>
<id>in-project</id>
<snapshots>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</snapshots>
<name>In Project Repo</name>
<url>file://${project.basedir}/libRepo</url>
</repository>
問題是當我更換libRepo
的jar(沒有更新版本號,因為它只是另一個快照)沒有使用這個更新的jar(來自.m2
目錄的舊版本),即使對於mvn -U clean install
如何制作maven更新這個罐子?
編輯 :根據什么是Maven快照,為什么我們需要它? maven應該嘗試找到從不版本的SNAPSHOT依賴,“即使在本地存儲庫中找到了這個庫的版本”。 我的設置有什么問題?
骯臟的解決方案 :基於Maven 2程序集的依賴性答案:在原始解決方案擴展后未包含的范圍“系統”下的jar似乎有效:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>hack-binary</id>
<phase>validate</phase>
<configuration>
<file>${repo.path.to.jar}</file>
<repositoryLayout>default</repositoryLayout>
<groupId>com.test</groupId>
<artifactId>fooLib</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
正如對該解決方案的評論中所提到的,它不能單獨工作,因此它與in-project
存儲庫(當依賴在本地.m2
存儲庫中不可用時工作)一起工作,而第二部分在每次構建期間刷新.m2
。
然而,我仍然不清楚為什么普通的“SNAPSHOT”機制不起作用(即當前的臟解決方案也可以在沒有SNAPSHOT的情況下工作,因為本地.m2
repo每次都明確更新)。 有沒有更干凈的方式?
解決方案 (基於Aaron的回答和討論):問題是我嘗試使用install-file
將文件安裝到libRepo
。 實際的解決方案是,如果庫更新,請使用
mvn deploy:deploy-file -Dfile=fooLib.jar -DgroupId=com.test \
-DartifactId=fooLib -Dversion=1.0-SNAPSHOT -Dpackaging=jar \
-Durl=file://..\libRepo -DrepositoryId=in-project
將其部署到回購。 正確部署后,maven正確處理SNAPSHOT。
如果你使用存儲庫,那么Maven會將JAR復制到它的本地存儲庫(通常在$HOME/.m2/repository/
)。 除非版本號更改,否則Maven不會認為此文件已更改,也不會復制它。 請注意,版本號是Maven唯一看到的內容; 它不關心校驗和或文件大小或日期。
順便說一下,為此目的在內部為快照分配了一個版本號:這樣Maven就可以在內部注意到快照已經更新。
我建議使用系統依賴 。 這樣,實際的JAR將被添加到類路徑中(沒有任何復制或東西)。 您也不需要復制此方法的repo結構,它將清楚地傳達您的意圖。
[編輯]我理解Maven以不同的方式處理與范圍system
依賴關系。 我不確定這是否有意義(如果它使用依賴編譯,它肯定可以用它來運行?)
在我看來,你有這些選擇:
使用deploy:deploy-file將依賴項安裝到libRepo
而不是自己復制它。 這應該以這樣的方式更新元數據:當您在真實項目上再次運行mvn install
時,Maven將再次復制它。
請注意file:install
不起作用。 文件插件用於訪問本地存儲庫,但您需要使用知道如何更新共享/服務器存儲庫的deploy插件。
將依賴項安裝到本地存儲庫中; 我建議使用一個腳本,你可以包含在你的項目中。 這樣,您可以避免所有問題,並且可以輕松地在新機器上進行設置。
更改依賴項的版本號,但這很乏味,當依賴項的實際版本號發生更改時,您可能會遇到麻煩。
為您的公司設置本地repo服務器並將依賴關系部署到它。 這將需要幾個小時,但a)您將獲得所有依賴項的本地緩存,使您的初始構建更快,b)它將更快地為其他開發人員設置。
Maven永遠不會讀取任何庫文件夾中的jar。 你必須首先了解maven是如何工作的。 maven查找jar的唯一地方是localRepository (.m2)
,如果沒有,它會搜索POM.xml
提到的其他存儲庫
前面的回答者(和一個評論者)指出,maven只在本地項目存儲庫中查找一次,在后續構建中,它從.m2-repository獲取緩存的jar。
我剛剛找到了一個解決方法,需要增加版本號(例如,對dev庫的小改動):
首先將jar重新安裝到本地項目庫中:
mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -DgroupId=com.johndoe.dev -DartifactId=Helpers -Dversion=0.1 -Dfile=C:/path/to/helpers.jar
(其中-Dfile可以指向生成helpers.jar的外部項目)
然后清除.m2-repository中的這個特定工件:
mvn dependency:purge-local-repository -DmanualInclude=com.johndoe.dev:Helpers:0.1
(使用com.johndoe.dev作為GroupId,將Helpers作為ArtifactId,並在上一步中安裝相同的版本)
執行后一步,maven使用您的本地project-repository jar文件重建.m2中的工件。
替代方案,也許是臟的變體:只需將helpers.jar復制到C:\\ Users \\ johndoe \\ .m2 \\ repository \\ com \\ johndoe \\ dev \\ Helpers \\ 0.1 \\ Helpers-0.1.jar(不知道linux,因為我沒有'在那里使用mave)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.