这是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标志。
这是一个错误,还是我错过了什么?
答案 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
也许有人觉得它有用。