当本地和远程仓库中存在时间戳不同的SNAPSHOT时,Maven如何解决SNAPSHOT依赖?
How does Maven resolve SNAPSHOT dependencies when there are SNAPSHOTS with different timestamps in the local and the remote repository?
假设我有一个项目 A
正在开发中,它依赖于项目 B
- 目前也在开发中,尚未发布。
因此,在 A
的 POM 文件中,我有以下部分:
<dependency>
<groupId>com.example</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
在工作中,我们有一个远程仓库 (Nexus) 和一个 CI 盒子 (运行 Jenkins)。
当我的同事对 B
进行更改并提交到 SVN 时,Jenkins 会选择该更改,对其进行编译并将其放入远程仓库中。大约在那个时候,我可能会在本地打开 B
,进行更改、编译并将其安装到我的本地存储库中。
当我尝试在本地 mvn clean install
A
时,Maven 现在如何解析 B
?
- 如果它找到一个,它是否总是默认为我的本地 SNAPSHOT?
- 它总是默认为远程 SNAPSHOT 吗?
- 它会查看时间戳吗?
- 它会做一些不同的事情吗?
前几天我们把自己搞得一团糟,基本上不得不手动删除本地存储库以确保我们得到了我们期望得到的版本。所以我现在想弄清楚到底发生了什么。 (因此,如果您有指向文档中详细说明的地方的链接,那也将不胜感激......)在本地,有时我的存储库文件夹中有一些 SNAPSHOT 构建,一个没有,一些有什么看起来像文件名的 SNAPSHOT
部分之后的时间戳...
您刚刚 mvn install
的工件没有时间戳。一旦您 mvn deploy
到您的 internal/remote 存储库,就会应用时间戳。如果您查看本地 ~/.m2/repository/B/1.0.0-SNAPSHOT/
文件夹中的 maven-metadata-local.xml
,您会看到以下行:
<updated>YYYYMMDDHHMMSS</updated>
这就是 Maven 依赖项解析器决定最新快照的方式。
如果您和您的同事碰巧在同一秒内部署到您的 internal/remote 存储库,则由存储库管理器(在您的情况下为 Nexus)来处理。
请注意:以上段落依赖于我使用 Maven 的经验,因为到目前为止我还没有看到详细描述的文档页面。非常欢迎输入在哪里可以找到参考以及添加和更正。
有关概述,请参阅 Maven / Introduction to Repositories。
如果您想确保使用最新的快照:
相应地在您的 settings.xml
中声明 <updatePolicy>
:
- updatePolicy: This element specifies how often updates should attempt to occur. Maven will compare the local POM’s timestamp (stored in a repository’s maven-metadata file) to the remote. The choices are:
always
, daily
(default), interval:X
(where X is an integer in minutes) or never.
使用-U
| --update-snapshots
命令行选项。
$ mvn -h
...
-U,--update-snapshots Forces a check for missing
releases and updated snapshots on
remote repositories
...
„文件名 SNAPSHOT 部分后的时间戳“ 对我来说很不寻常。 AFAIHS 只有一个。如果项目 POM 中的 <artifactId>
中有“-SNAPSHOT”,则可能会发生这种情况。
更新
另请参阅:
Repository - SNAPSHOT Handling,内容为:
This documentation was targetted at Maven 2.0 alpha 1. It is here only for historical reference and to be updated and integrated into the Maven documentation.
但到目前为止我还没有找到任何集成了此功能的最新文档。
-
-
假设我有一个项目 A
正在开发中,它依赖于项目 B
- 目前也在开发中,尚未发布。
因此,在 A
的 POM 文件中,我有以下部分:
<dependency>
<groupId>com.example</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
在工作中,我们有一个远程仓库 (Nexus) 和一个 CI 盒子 (运行 Jenkins)。
当我的同事对 B
进行更改并提交到 SVN 时,Jenkins 会选择该更改,对其进行编译并将其放入远程仓库中。大约在那个时候,我可能会在本地打开 B
,进行更改、编译并将其安装到我的本地存储库中。
当我尝试在本地 mvn clean install
A
时,Maven 现在如何解析 B
?
- 如果它找到一个,它是否总是默认为我的本地 SNAPSHOT?
- 它总是默认为远程 SNAPSHOT 吗?
- 它会查看时间戳吗?
- 它会做一些不同的事情吗?
前几天我们把自己搞得一团糟,基本上不得不手动删除本地存储库以确保我们得到了我们期望得到的版本。所以我现在想弄清楚到底发生了什么。 (因此,如果您有指向文档中详细说明的地方的链接,那也将不胜感激......)在本地,有时我的存储库文件夹中有一些 SNAPSHOT 构建,一个没有,一些有什么看起来像文件名的 SNAPSHOT
部分之后的时间戳...
您刚刚 mvn install
的工件没有时间戳。一旦您 mvn deploy
到您的 internal/remote 存储库,就会应用时间戳。如果您查看本地 ~/.m2/repository/B/1.0.0-SNAPSHOT/
文件夹中的 maven-metadata-local.xml
,您会看到以下行:
<updated>YYYYMMDDHHMMSS</updated>
这就是 Maven 依赖项解析器决定最新快照的方式。
如果您和您的同事碰巧在同一秒内部署到您的 internal/remote 存储库,则由存储库管理器(在您的情况下为 Nexus)来处理。
请注意:以上段落依赖于我使用 Maven 的经验,因为到目前为止我还没有看到详细描述的文档页面。非常欢迎输入在哪里可以找到参考以及添加和更正。
有关概述,请参阅 Maven / Introduction to Repositories。
如果您想确保使用最新的快照:
相应地在您的
settings.xml
中声明<updatePolicy>
:- updatePolicy: This element specifies how often updates should attempt to occur. Maven will compare the local POM’s timestamp (stored in a repository’s maven-metadata file) to the remote. The choices are:
always
,daily
(default),interval:X
(where X is an integer in minutes) ornever.
- updatePolicy: This element specifies how often updates should attempt to occur. Maven will compare the local POM’s timestamp (stored in a repository’s maven-metadata file) to the remote. The choices are:
使用
-U
|--update-snapshots
命令行选项。$ mvn -h ... -U,--update-snapshots Forces a check for missing releases and updated snapshots on remote repositories ...
„文件名 SNAPSHOT 部分后的时间戳“ 对我来说很不寻常。 AFAIHS 只有一个。如果项目 POM 中的 <artifactId>
中有“-SNAPSHOT”,则可能会发生这种情况。
更新
另请参阅:
Repository - SNAPSHOT Handling,内容为:
This documentation was targetted at Maven 2.0 alpha 1. It is here only for historical reference and to be updated and integrated into the Maven documentation.
但到目前为止我还没有找到任何集成了此功能的最新文档。