我怎样才能让Maven停止尝试检查来自maven-central-repo的某个组的工件更新?

我正在做一个相当大的Maven项目。 我们大概有大约70个左右的个体工件,大致分为两个共享代码库和10个使用它们的应用程序。 所有这些项目都位于命名空间com.mycompany.*

大多数情况下,我们正在运行快照构build。 所以要完成一个应用程序的构build,我可能会首先构build库项目,以便将它们安装到我的本地存储库(例如, mycompany-libname-2.4-SNAPSHOT.jar )。

问题是,当我然后去build立应用程序。 出于某种原因,Maven希望检查主要的两个公共仓库(maven-net-repo和java-net-repo)以获取所有mycompany-*-SNAPSHOT.jar工件的更新。 当然,他们不在那里,一切都最终解决了我刚刚build立到我的本地存储库的版本,但我希望Maven停止这样做,因为(一)它使我感觉像一个坏net.citizen不断地检查这些存储库中永远不会存在的东西,(b)在我的构build过程中增加了一些不必要的和烦人的networking延迟。

我大多数时间都是在离线模式下运行maven来解决这个问题,但这样做并不理想,因为偶尔会对公共库进行更新。 所以我正在寻找的是一个解决scheme,这将导致Maven不检查给定存储库的更新满足某些标准的工件 – 在这种情况下,如果Maven会忽略SNAPSHOT版本或工件com.mycompany命名空间。

updatePolicy标记对我不起作用。 但是,Rich Seller提到快照应该被禁用,所以我进一步查看,发现我添加到我的settings.xml中的额外的存储库实际上导致了问题。 在我的settings.xml中将快照部分添加到这个存储库中有窍门!

 <repository> <id>jboss</id> <name>JBoss Repository</name> <url>http://repository.jboss.com/maven2</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> 

另外,你可以在mvn命令行中使用-o--offline ,这样maven就会处于“脱机模式”,所以它不会检查更新。 你会得到一些关于不能得到你的本地回购的依赖关系的警告,但没有什么大不了的。

现在在maven中也有一些东西

 mvn goal --no-snapshot-updates 

或者简而言之

 mvn goal -nsu 

更新:我应该可能已经开始,因为你的项目是SNAPSHOTs。 它是SNAPSHOT语义的一部分,Maven将检查每个版本的更新。 作为一个SNAPSHOT意味着它是不稳定的,可能会改变,所以更新应该检查。 不过值得指出的是, Maven超级POMconfiguration中央禁用了快照,因此Maven不应该检查中央SNAPSHOT的更新,除非您在自己的POM /设置中覆盖了该更新。


您可以将Mavenconfiguration为使用中央存储库的镜像 ,这将redirect所有通常会集中到您的内部存储库的请求。

在你的settings.xml中,你可以添加这样的内容来设置你的内部仓库作为中央镜像:

 <mirrors> <mirror> <id>ibiblio.org</id> <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name> <url>http://path/to/my/repository</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> 

如果您使用像Nexus这样的存储库pipe理器作为您的内部存储库。 您可以为代理中央设置代理存储库 ,因此通常转到中央的所有请求都会发送到您的代理存储库(或包含代理的存储库组 ),随后的请求将caching到内部存储库pipe理器中。 您甚至可以将代理caching超时设置为-1,因此它永远不会请求已经在代理存储库中的中央内容。


如果仅使用本地存储库,则更基本的解决scheme是将中央存储库的updatePolicy设置为“never”,这意味着Maven将只检查尚不在本地存储库中的工件。 这可以在需要时通过使用-U开关强制Maven检查更新来在命令行覆盖。

你可以像下面这样configuration仓库(在你的pom或settings.xml中的configuration文件):

 <repository> <id>central</id> <url>http://repo1.maven.org/maven2</url> <updatePolicy>never</updatePolicy> </repository> 

很简单 :

在您的超级POM父母或设置

  <repository> <id>central</id> <releases> <updatePolicy>never</updatePolicy> </releases> <snapshots> <updatePolicy>never</updatePolicy> </snapshots> <url>http://repo1.maven.org/maven2</url> <layout>legacy</layout> </repository> 

这是我的提示

我遇到类似这样的麻烦,

 <repository> <id>java.net</id> <url>https://maven-repository.dev.java.net/nonav/repository</url> <layout>legacy</layout> </repository> <repository> <id>java.net2</id> <url>https://maven2-repository.dev.java.net/nonav/repository</url> </repository> 

将updatePolicy设置为“never”不起作用。 删除这些回购是我解决它的方式。 PS:我正在关注这个关于Web服务的教程 (顺便说一句,也许是最好的Ws教程)