搬迁指南
有时需要重新定位存储库中的工件。一个例子是当一个项目从一个 groupId 移动到另一个 groupId 时。
对存储库进行更改可能会产生深远的影响。所以最好在第一时间就做好,因此本指南。
2020 年返工正在进行中,请参阅开发邮件列表上的讨论,仍然需要分析问题,定义改进,当然还有实施......
如何将 Maven 2 工件重新定位到不同的 groupId
下面示例的目标是让foo
项目将其 groupId 从 重新定位bar
到org.bar
。
处理过去的版本
- 将 Maven 2 存储库中的所有
foo
相关文件复制/bar/foo/
到临时位置。 org.bar
在临时位置的所有foo
相关 POM 文件中将groupId 更改为。- 将所有文件从临时位置复制到
/org/bar/foo/
Maven 2 存储库中。 - 为 Maven 2 存储库中的每个旧版本创建一个最小的 Maven 2 POM 文件
foo
。POM 文件只需要包含groupId
、、artifactId
和version
重定位部分。注意:在
/bar/foo/
用这些最小的 POM 文件替换旧的 POM 文件之前,请确保您已进行备份!对于 1.0 版,最小的 POM 文件可能如下所示
foo
:<project> <modelVersion>4.0.0</modelVersion> <groupId>bar</groupId> <artifactId>foo</artifactId> <version>1.0</version> <distributionManagement> <relocation> <groupId>org.bar</groupId> </relocation> </distributionManagement> </project>
在这种情况下,我们正在重新定位,因为 groupId 已更改。我们只需要将已更改的元素添加到
relocation
元素中。有关元素中允许使用哪些元素的信息relocation
,请参阅POM 参考。 /bar/foo/
如果您的项目使用 MD5 或 SHA1 校验和,您现在必须为Maven 2 存储库中的 pom 文件创建新的校验和。如果 POM 文件需要签名,也可以这样做。- 如果您的项目与 Central 同步,您现在应该启动该同步。这可能会根据您的项目同步策略自动发生。
您的foo
-artifacts 现在可供具有旧 groupId 和新 groupId 的 Maven 用户使用。使用旧 groupId 的项目将自动重定向到新 groupId 并发出警告,告诉用户更新其依赖项。
发布下一个版本
当下一个版本发布时foo
,您应该发布两个 Maven 2 POM 文件:首先您应该foo
使用新的 groupId 发布 的 POM org.bar
。
因为存储库中的数据不应该更改,所以 Maven 不会下载它已经下载的 POM 文件。因此,您还需要为新版本发布带有旧 groupId 的重定位 POM 文件bar
:这应该是最小的重定位 POM(如上面第 4 步所述),但对于新版本的foo
.
对于之后的发布,您只需要发布一个 groupId 为 的 Maven POM org.bar
,因为之前版本的用户已被告知更改了 groupId。
例子
apache蚂蚁
- 已将其版本发布到 1.6.5 到 Maven 1 兼容
ant:ant
坐标(请参阅存储库内容), - 从 1.7.0 开始,移动到反向 DNS 兼容的 Maven 2+
org.apache.ant:ant
坐标,(参见存储库内容), - 在旧 groupId 中发布了一个
ant:ant:1.7.0
重定位 POM 以宣传有关移动的信息(请参阅存储库内容)。
请注意,过去的ant:ant
POM 版本(直到 1.6.5)没有被修改来宣传这一举动:中央 POM 内容一旦发布就不会改变(因为初始内容已经下载了很多次并且预计不会重新加载之后)。