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

Tim*_*ert 122 java maven-2 repository

我正在研究一个相当大的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命名空间.

小智 160

此外,您可以使用-o--offline在mvn命令行中将maven置于"脱机模式",这样它就不会检查更新.您将收到一些警告,说明无法获取本地仓库中尚未存在的依赖项,但没什么大不了的.

  • 这将阻止maven下载已发布的依赖项.您可能需要更新版本的已发布库,而不检查快照以进行更新 (6认同)
  • 这绝对不是原始问题的答案!怎么会有这么多的赞成?OP明确写道,他试图在离线模式下运行maven,但它并不适合他的目的! (2认同)

joo*_*ten 88

现在在maven中也可以使用的东西是

mvn goal --no-snapshot-updates
Run Code Online (Sandbox Code Playgroud)

或简而言之

mvn goal -nsu
Run Code Online (Sandbox Code Playgroud)

  • 此外,`nsu`选项在v 3.0.3中被破坏(参见[**MNG-5064**](http://jira.codehaus.org/browse/MNG-5064)).要可靠地使用此选项,您可能需要升级到至少v.3.0.4或v.3.0.5 (5认同)
  • 以防任何SBT人员落在这里:在会话中```offline offline:= true```,或者在```build.sbt```中```offline:= true```. (3认同)
  • 对我来说没有任何改变:\ (2认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)


Ric*_*ler 32

更新:我应该从这开始,因为你的项目是SNAPSHOTs.它是SNAPSHOT语义的一部分,Maven将检查每个构建的更新.作为SNAPSHOT意味着它是易变的并且可能会发生变化,因此应该检查更新.然而,值得指出的是,Maven超级POM 配置中心以禁用快照,因此Maven不应该检查中央SNAPSHOT的更新,除非您在自己的pom /设置中覆盖了它.


您可以将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>
Run Code Online (Sandbox Code Playgroud)

如果您正在使用Nexus等存储库管理器作为内部存储库.您可以为代理中心设置代理存储库,因此通常转到Central的任何请求都会发送到您的代理存储库(或包含代理的存储库组),后续请求将缓存在内部存储库管理器中.您甚至可以将代理缓存超时设置为-1,因此它永远不会从代理存储库中已有的中心请求内容.


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

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

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>
Run Code Online (Sandbox Code Playgroud)


小智 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>
Run Code Online (Sandbox Code Playgroud)

这是我的提示