代码之家  ›  专栏  ›  技术社区  ›  Tim Gilbert

如何让Maven停止尝试检查Maven Central repo中某个组的工件更新?

  •  112
  • Tim Gilbert  · 技术社区  · 16 年前

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

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

    问题是,当我开始构建应用程序时。出于某些原因,Maven想要检查主要的两个公共存储库(Maven Net RePo和Java Net RePo),以便更新所有的公共存储库(Maven Net RePo和Java Net RePO)。 mycompany-*-SNAPSHOT.jar 人工产品。当然,在那里没有找到它们,所有的东西最终都会恢复到我刚构建到本地存储库的版本,但是我希望Maven停止这样做,因为(a)它让我觉得自己是一个糟糕的net.citizen,因为它不断地检查这些存储库中是否有永远不会存在的东西,以及(b)它添加了一些不必要和烦人的网络。在我的构建过程中处理延迟。

    大部分时间我都在离线模式下运行Maven来解决这个问题,但这并不理想,因为偶尔会更新对公共库的依赖。所以我要寻找的是一个解决方案,它将导致Maven不检查给定存储库中符合特定条件的工件的更新-在这种情况下,如果Maven忽略快照版本或 com.mycompany 命名空间。

    6 回复  |  直到 12 年前
        1
  •  28
  •   Dennis Lassing    13 年前

    updatepolicy标记对我不起作用。不过,Rich Seller提到无论如何都应该禁用快照,所以我进一步研究并注意到,我添加到settings.xml中的额外存储库实际上导致了这个问题。在my settings.xml中将snapshots部分添加到这个存储库中就成功了!

    <repository>
        <id>jboss</id>
        <name>JBoss Repository</name>
        <url>http://repository.jboss.com/maven2</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
    
        2
  •  152
  •   joostschouten    12 年前

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

        3
  •  81
  •   Elazar Leibovich    13 年前

    现在Maven也有这种功能

    mvn goal --no-snapshot-updates
    

    或者说简而言之

    mvn goal -nsu
    
        4
  •  30
  •   Rich Seller    16 年前

    更新:我可能应该从这个开始,因为您的项目是快照。它是快照语义的一部分,Maven将检查每个构建的更新。快照意味着它是不稳定的,可能会发生变化,所以应该检查更新。但是值得指出的是 Maven super POM 将Central配置为禁用快照,因此Maven不应检查Central上快照的更新,除非您在自己的POM/设置中覆盖了更新。


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

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


    如果只使用本地存储库,则更基本的解决方案是设置 更新策略 对于中央存储库“从不”,这意味着Maven将只检查本地存储库中没有的工件。然后,如果需要,可以在命令行中通过使用-u开关强制maven检查更新来覆盖它。

    您将(在pom或settings.xml中的概要文件中)配置存储库,如下所示:

    <repository>
      <id>central</id>
      <url>http://repo1.maven.org/maven2</url>
      <updatePolicy>never</updatePolicy>
    </repository>
    
        5
  •  4
  •   Bruno Régnier    13 年前

    非常简单:

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

    这是我的小窍门

        6
  •  0
  •   thirdy    14 年前

    我也遇到过类似的问题,

    <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”不起作用。删除这些回购协议是我解决它的方法。 附言:我在跟踪这件事 tutorial 关于Web服务(BTW,可能是Java的最佳教程)