当本地和远程存储库中存在具有不同时间戳的SNAPSHOTS时,Maven如何解决SNAPSHOT依赖关系?

Chr*_*ian 16 snapshot dependency-management pom.xml maven dependency-resolver

假设我有一个A依赖于项目的开发项目B- 该项目目前正在开发中,尚未发布.

所以,在APOM文件中,我有以下部分:

<dependency>
  <groupId>com.example</groupId>
  <artifactId>project-b</artifactId>
  <version>1.0.0-SNAPSHOT</version>
<\dependency>
Run Code Online (Sandbox Code Playgroud)

在工作中,我们有一个远程仓库(Nexus)和一个CI盒(运行Jenkins).

当我的同事改变B并提交给SVN时,Jenkins会选择更改,编译并将其放入远程仓库.大约在那个时候,我可能会B在本地打开,进行更改,编译并将其安装到我的本地仓库中.

B当我尝试mvn clean install A本地时,Maven现在如何解决?

  • 它是否总是默认为我的本地SNAPSHOT如果找到一个?
  • 它总是默认为远程SNAPSHOT吗?
  • 它会看时间戳吗?
  • 它会做些不同的事吗?

前几天我们弄得一团糟,基本上不得不手动删除本地存储库,以确保我们得到了我们期望获得的版本.所以我现在想弄清楚究竟发生了什么.(因此,如果你有详细文档中的地点的链接,那也将非常感激...)在本地,我有时在我的存储库文件夹中有一些SNAPSHOT版本,一个没有,有几个用什么看起来像SNAPSHOT文件名部分之后的时间戳...

Ger*_*ica 11

您只是mvn install没有得到时间戳的工件.一旦您mvn deploy进入内部/远程存储库,就会应用时间戳.如果你查看maven-metadata-local.xml你的本地~/.m2/repository/B/1.0.0-SNAPSHOT/文件夹,你会看到以下行:

<updated>YYYYMMDDHHMMSS</updated> 
Run Code Online (Sandbox Code Playgroud)

这就是Maven依赖项解析器决定最新快照的方式.

如果碰巧您和您的同事在同一秒内部署到您的内部/远程存储库,则由存储库管理器(在您的情况下为Nexus)来处理此问题.

请注意:上面的段落依赖于我对Maven的经验,因为我还没有看到一个文档页面,到目前为止所有细节都有描述.输入在哪里可以找到参考以及添加和更正非常受欢迎.

有关概述,请参阅Maven /存储库简介.

如果您想确保使用最新快照:

"文件名的SNAPSHOT部分之后的时间戳"对我来说很不寻常.AFAIHS它只是一个或另一个.虽然如果<artifactId>项目的POM中有"-SNAPSHOT",就会发生这种情况.

UPDATE

也可以看看:

  • 存储库 - SNAPSHOT处理,其内容如下:

    本文档的目标是Maven 2.0 alpha 1.它仅供历史参考,并且需要更新并集成到Maven文档中.

    但到目前为止,我没有找到任何最新的文档.

  • 了解Maven版本号.

  • 具有较新时间戳的工件优先于它们来自何处.使用默认设置"远程时间戳"每24小时仅检查一次.后者意味着您的本地工件可能优先(即使有更新的远程可用),因为甚至没有检查是否有新的远程存在. (2认同)