使用 Maven 发布过程跨平台同步工件版本

Posted

技术标签:

【中文标题】使用 Maven 发布过程跨平台同步工件版本【英文标题】:Synchronizing artifact versions across platforms with maven release process 【发布时间】:2012-04-05 12:12:15 【问题描述】:

我有一个应该为多个目标平台构建的工件:

Linux x86 Windows x86 ARM11

很遗憾,由于缺少交叉编译器,不可能一次性创建工件的所有版本。

换句话说,目标是在存储库中有这样的东西

artifact-1.0.0-linux.zip artifact-1.0.0-windows.zip artifact-1.0.0-arm11.zip artifact-1.0.1-linux.zip artifact-1.0.1-windows.zip artifact-1.0.1-arm11.zip ...

请注意,版本是同步的。如何做到这一点?

问题是每次构建后发布过程都会升级 pom.xml 的版本。因此,通过在各种平台上连续构建,我可以实现拥有

artifact-1.0.0-linux.zip artifact-1.0.1-windows.zip artifact-1.0.2-arm11.zip artifact-1.0.3-linux.zip artifact-1.0.4-windows.zip artifact-1.0.5-arm11.zip ...

但这不是我想要的。

我可以

    在 Linux 上运行

    mvn 发布:准备发布:执行 -DpushChanges=false

    (将 pushChanges 设置为 false 发布不会增加 SCM 中的版本号)

    然后在 Windows 上运行

    mvn 发布:准备发布:执行

    (这会增加版本号)

但是,按正确顺序在各种平台上触发发布过程的责任在于我。 maven 有什么办法可以帮我解决这个问题吗?

你有什么建议吗?

谢谢


PS。请注意,这不是关于如何组织成模块的问题。它是关于如何在多个平台上同步单个工件的发布过程。

【问题讨论】:

【参考方案1】:

您找到解决方案了吗? 很高兴知道我不是唯一一个与 Maven 战斗的人 :-)

不管怎样,

您是否可以将已发布的版本部署到 nexus? 我在想,你可以这样做:

1 - 从 Windows 机器执行“mvn release:prepare release:perform” - 应该将 artifact-1.0.1-windows.zip 放入 nexus。

2 - 从源代码管理中签出 artifact-1.0.1 标记

3 - 从 linux 和 arm11(无论是什么 :P)执行“mvn deploy” - 这也应该将 -linux.zip 和 -arm11.zip 放入 nexus。

不过,我相信根据 nexus 的配置方式,它不会让您使用相同的 GAV 重新部署任何东西(即使分类器不同)

【讨论】:

【参考方案2】:

如我所见,您使用 linuxwindowsarm11 之类的分类器(工件的文件名后缀)来区分各种工件的版本,用于特定平台。因此,如果您创建由 Maven 管理的多模块项目,其中模块将是具有相同groupId、相同artifactId、相同version(可能从它们共同的父级继承)但不同classifier 的工件,你'会得到你想要的。在这种情况下,你总是释放你的多模块 POM(通常它也是它的模块的公共父级)以一次释放所有模块。假设 same-version-for-all-modules-policy (这似乎很适合这里),你基本上可以执行:

mvn release:prepare release:perform -DautoVersionSubmodules

就是这样。您将获得 artifact-1.0.0-linux.zipartifact-1.0.0-windows.zipartifact-1.0.0-arm11.zip 发布的工件。所有模块的下一个开发版本将设置为1.0.1-SNAPSHOT(通过从父级继承)。

【讨论】:

但我的意思是,当您使用 linux 时,您无法为 Windows 创建二进制文件(由于某些工具链限制)。因此,在 Linux 上运行的构建过程无法创建 Windows 二进制文件。反之亦然。因此,您无法一次性为所有平台创建所有二进制文件。 --- 这不是关于如何组织成模块的问题。它是关于如何在多个平台上同步单个工件的发布过程。 好的,所以我担心 Maven 无法帮助您自动执行此操作,除非您想(并且有时间)创建自己的发布插件。正如您所提到的,您可以在不修改版本的情况下执行所有版本,然后在最后全局修改它,但这是您必须记住的事情。您还可以丢弃通用版本控制(从父级继承)并在所有模块的 POM 中逐字键入版本。但是,这一次,您必须控制此过程并确保所有模块都随版本一起发布,并且每个模块都发布一次。我真的看不到 100% 自动的方式。 只是在想,同步构建的最佳位置是工件存储库,但是它需要允许将已发布的工件标记为不完整(例如仍在等待对于 Windows 工件)。但是第一个发布过程(在 Linux 上运行的那个)需要声明预计会出现多少工件。是的.. 太复杂了。 你能用詹金斯吗?我不是 Jenkins 专家,但对 docs 的快速浏览给了我一个关于分布式构建的页面。我会让你判断这是否符合你的需求。 在我的情况下 Quickbuild,不是 Jenkins,但正确。这正是我将应用的解决方案。【参考方案3】:

你帮我解决了你的问题...我不知道 pushChanges=false 选项。

使用Jenkins,您可以使用“触发器远程构建(例如,从脚本)”功能在每个执行 maven 版本的平台上设置作业。如果您愿意,您可以使用参数化构建来选择要构建的版本(如果您使用它,那么您需要 Parameterized Trigger Plugin 来触发其他平台上的构建)。

【讨论】:

以上是关于使用 Maven 发布过程跨平台同步工件版本的主要内容,如果未能解决你的问题,请参考以下文章

如何将 maven 工件从 jcenter 同步到 maven Central?

IDEA插件开发(14)---IntelliJ 平台工件存储库

创建发布版本后如何管理 Maven 依赖工件

配置 Maven 或 Nexus 以在静态 URL 链接主干工件

我自己的 Maven 插件如何获得 Maven 工件的可用版本?

Maven 程序集:添加同一工件的不同版本