Maven强制更新快照依赖项

时间:2014-09-22 21:07:46

标签: maven

这是mvn -version的结果:

Apache Maven 3.0.4 (r1232337; 2012-01-17 00:44:56-0800)
Maven home: /usr/share/maven
Java version: 1.7.0_67, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.8.5", arch: "x86_64", family: "mac"

假设我有快照依赖:

<dependency>
    <groupId>org.puzzled</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.4-SNAPSHOT</version>
</dependency>

我在本地仓库中下载了该快照的副本。但随后其他开发人员进行了改进,并对foo-1.0.4-SNAPSHOT.jar进行了更新。我想通过从远程存储库下载它来发布Maven一个执行命令以更新该依赖关系。

根据对this的回复以及关于SO的许多其他问题,如果我这样做

mvn clean -U package

它应该(重新)下载所有依赖项。对?这不是发生的事情。它下载快照依赖项的元数据,推断(并且错误地),不需要更新。我必须删除本地.m2存储库中的关联子目录,以便Maven从远程仓库更新快照版本,即使使用-U标志。

这是一个错误,还是我错过了什么?

4 个答案:

答案 0 :(得分:4)

mvn clean install -U

-U表示强制更新依赖项。

答案 1 :(得分:2)

存储库是否可能使用非唯一的SNAPSHOT名称发布您的foo

这个blog entry很好地解释了唯一和非唯一SNAPSHOT工件之间的区别。

基本上,如果工件元数据在nexus 上显示为foo-1.0.4-SNAPSHOT.jar,则它是非唯一的。如果它显示为foo-1.0.4-20160122.172609-36.jar,则它是唯一的。

您可以在Maven 3中发布唯一的快照工件,但仍然可以解析旧的带时间戳的非唯一快照......但它非常不合适。看一下ancient doc,似乎文件系统日期和本地和远程机器上的metadata.xml之间存在一些不清楚和模糊的交互。

基本上:(1)尝试确保您的SNAPSHOT依赖项是使用独特的工件发布的,(2)如果它们不是,则不依赖于检测到新的SNAPSHOT。使用mvn dependency:purge-local-repository和相应的包含来删除当地m2中的旧SNAPSHOT。

答案 2 :(得分:0)

元数据很可能在您下载工件的Nexus或本地存储库中被破坏。

如果Nexus是你的,我会重建元数据。

答案 3 :(得分:0)

我使用这个 shell 脚本解决了这个问题:

# Get path to local maven repo...
MVN_REPO=$(mvn help:evaluate -Dexpression=settings.localRepository | grep -e '^/')

echo "Local Maven repository is here: $MVN_REPO"
 
# Remove SNAPSHOT versions in "com/github/myusername" sub directory...
find "$MVN_REPO/com/github/myusername" -name *-SNAPSHOT.jar -exec rm {} \;

它会在您的本地 Maven 存储库中查找以 -SNAPSHOT.jar 结尾的特定组 ID 的所有 jar 文件并删除它们。

然后可以使用以下方法成功触发构建:

mvn clean -U package

也许有人觉得它有用。