我如何才能使Maven停止尝试从maven-central-repo中检查特定组中工件的更新?


126

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

在大多数情况下,我们都在使用快照构建。因此,要完整构建应用程序,我可能首先要构建库项目,以便将它们安装到我的本地存储库中(例如mycompany-libname-2.4-SNAPSHOT.jar)。

问题是当我随后构建应用程序时。出于某种原因,Maven希望检查主要的两个公共存储库(maven-net-repo和java-net-repo)以获取所有mycompany-*-SNAPSHOT.jar工件的更新。当然,在那里找不到它们,并且最终所有内容都可以还原到我刚刚在本地存储库中构建的版本,但是我希望Maven停止这样做,因为(a)这会让我感觉像是一个糟糕的net.citizen用于不断检查这些存储库中是否存在永远不会存在的内容,并且(b)在我的构建过程中增加了一些不必要的烦人的网络延迟。

我大部分时间都是在脱机模式下运行Maven的,但这种方法并不理想,因为偶尔会更新对公共库的依赖。因此,我正在寻找一种解决方案,该解决方案将导致Maven不检查给定存储库中满足某些条件的工件的更新-在这种情况下,如果Maven忽略SNAPSHOT版本或其中的工件,我将很高兴该com.mycompany命名空间。

Answers:


34

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>

非常感谢您的回答。最终对我有所帮助。我在使用其中一个存储库的快照下载时遇到了一些麻烦。即使更新警察从未下载过,也无法进行下载。现在没有下载快照,这正是我想要的。
Wolfroma

163

另外,您可以在mvn命令行中使用-o--offline,这会将maven置于“离线模式”,因此它不会检查更新。您将收到有关无法获取本地存储库中尚未存在的依赖项的警告,但没什么大不了的。


8
这也将阻止Maven下载已发布的依赖项。您可能需要更新版本的已发布库,而无需检查快照是否进行更新
hobgoblin

2
这显然不是原始问题的答案!它怎么会有这么多投票?OP明确写道,他尝试在脱机模式下运行Maven,但这对于他的目的而言并不理想!
Honza Zidek

95

Maven现在也提供了一些功能

mvn goal --no-snapshot-updates

或总之

mvn goal -nsu

3
以防万一有SBT人士落在这里:set offline := true在会议中或offline := truebuild.sbt
2012年

5
另外,该nsu选项在3.0.3版中无效(请参见MNG-5064)。为了可靠地使用此选项,您可能需要升级到至少3.0.4版或3.0.5版
Ashutosh Jindal

最好的
-AntJavaDev

32

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


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

在您的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之类的资源库管理器作为内部资源库。您可以为proxy Central 设置代理存储库,因此通常会转到Central的所有请求都将发送到您的代理存储库(或包含该代理的存储库组),并且后续请求都将缓存在内部存储库管理器中。您甚至可以将代理缓存超时设置为-1,因此它将永远不会从中央请求代理存储库中已经存在的内容。


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

您将按照以下方式配置存储库(在pom或settings.xml中的配置文件中):

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

我们实际上确实已经有一个中央存储库,但是我们当然不向其发布快照版本,因此大概我在使用代理/镜像的情况下仍然无法通过更新检查-我正在寻找一种方法来获取Maven根本不检查这些工件的更新。
蒂姆·吉尔伯特

1
还需要在中央存储库中为SNAPSHOT设置逻辑存储库。这意味着它们可以在您的开发人员之间共享,而您不必全部在本地构建它们。然后,只要将任何SNAPSHOT依赖项的更改推送到远程存储库中,就可以获取SNAPSHOT的全部好处。
Rich Seller

谢谢-updatePolicy标志与我一直在寻找的一样。
蒂姆·吉尔伯特

1
Nexus还允许您配置规则,以防止任何将公司产品发送到外部的请求。
布赖恩·福克斯

此处的XML代码段已过时。该updatePolicy元素位于snapshotsor releases元素下方。请参阅:maven.apache.org/settings.html
杰夫·埃文斯

5

很简单 :

在您的Super POM父项或setting.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>

这是我的秘诀


0

我遇到了类似的麻烦

<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服务的本教程(顺便说一句,可能是ws for Java的最佳教程)


1
您在使用Intellij吗?因为Intellij + Maven =忽略updatePolicy。请参阅错误报告youtrack.jetbrains.com/issue/IDEA-76869
Manav
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.