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

我正在做一个相当大的 Maven 项目。我们可能有大约70个单独的工件,它们大致分为两个共享代码库和可能10个使用它们的应用程序。所有这些项都存在于名称空间 com.mycompany.*中。

大部分时间我们都是在运行快照构建。因此,为了完成应用程序的完整构建,我可能首先构建库项目,以便将它们安装到我的本地存储库(例如,mycompany-libname-2.4-SNAPSHOT.jar)中。

问题是,当我开始构建应用程序时。出于某种原因,Maven 希望检查主要的两个公共存储库(Maven-net-repo 和 java-net-repo) ,以获取所有 mycompany-*-SNAPSHOT.jar构件的更新。当然,它们并不存在,所有的问题最终都会回到我刚刚在本地存储库中构建的版本,但是我希望 Maven 停止这样做,因为(a)它让我觉得自己像一个坏的 net.public,因为我不断地检查这些存储库中永远不会存在的东西,(b)它在我的构建过程中添加了一些不必要的和恼人的网络延迟。

我大部分时间都在离线模式下运行 maven 来解决这个问题,但这并不理想,因为偶尔会更新对公共库的依赖。因此,我正在寻找一个解决方案,这将导致 Maven 不检查来自特定存储库的符合特定条件的工件的更新——在这种情况下,如果 Maven 忽略 SNAPSHOT 版本或者 com.mycompany名称空间中的工件,我会很高兴。

134037 次浏览

更新: 由于您的项目是 SNAPSHOT,我可能应该从这里开始。Maven 将检查每个构建的更新,这是 SNAPSHOT 语义的一部分。作为一个 SNAPSHOT 意味着它是易变的并且易于更改,因此应该检查更新。但是值得指出的是,Maven 超级 POM将中央配置为禁用快照,所以 Maven 永远不应该检查中央 SNAPSHOT 的更新,除非您在自己的 pom/设置中覆盖了这一点。


您可以将 Maven 配置为对中央存储库使用 镜子,这将重定向通常会转到中央存储库的所有请求。

在 setings.xml 中,您可以添加这样的内容,将内部存储库设置为 Central 的镜像:

<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这样的存储库管理器。您可以为代理中心设置一个 代理存储库代理存储库,这样通常会发送到 Central 的任何请求都会被发送到代理存储库(或者包含代理的 存储库组) ,随后的请求会被缓存到内部存储库管理器中。您甚至可以将代理缓存超时设置为 -1,因此它永远不会从中心请求已经存在于代理存储库中的内容。


如果您只使用本地存储库,一个更基本的解决方案是将中央存储库的 UpdatePolicy 更新策略设置为“ never”,这意味着 Maven 将只检查本地存储库中没有的构件。然后,当需要时,可以使用-U 开关强制 Maven 检查更新,从而在命令行重写这个命令。

您可以按以下方式配置存储库(在您的 pom 中或者 setings.xml 中的配置文件中) :

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

此外,您可以在 mvn 命令行中使用 -o--offline,这将使 maven 处于“脱机模式”,因此它不会检查更新。您会得到一些警告,说明不能在本地回购中获取依赖项,但这没什么大不了的。

我也遇到过类似的麻烦,

<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 设置为“永远”不起作用。删除这些回购是我解决这个问题的方法。 Ps: 我遵循了这个关于 Web 服务的 教程(顺便说一句,可能是最好的 java WS 教程)

现在 Maven 也提供了一些东西

mvn goal --no-snapshot-updates

简而言之

mvn goal -nsu

UpdatePolicy 标签对我不起作用。然而 Rich Seller 提到快照应该被禁用,所以我进一步查看并注意到我添加到 setings.xml 中的额外存储库实际上导致了这个问题。在 setings.xml 中将快照部分添加到这个存储库中起到了作用!

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

很简单:

在 Super POM 父文件或 seting.xml 中,使用

        <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>

这是我的小费