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

问题

我正在研究一个相当大的Maven项目。我们可能有大约70个左右的单个工件,它们大致分为两个共享代码库,也许有十个使用它们的应用程序。所有这些项都存在于namespacecom.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版本或其中的工件,我会很高兴thecom.mycompanynamespace。


#1 热门回答(141 赞)

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


#2 热门回答(77 赞)

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

mvn goal --no-snapshot-updates

或简而言之

mvn goal -nsu

#3 热门回答(29 赞)

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

你可以将Maven配置为使用amirror作为中央存储库,这将重定向通常发送到内部存储库的所有请求。

在你的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的存储库管理器。你可以为代理中心设置aproxy repository,因此通常转到Central的任何请求都会发送到你的代理存储库(或包含代理的arepository group),后续请求将缓存在内部存储库管理器中。你甚至可以将代理缓存超时设置为-1,因此它永远不会从代理存储库中已有的中心请求内容。

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

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

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