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

使用maven发布过程跨平台同步工件版本,maven,maven-release-plugin,multiplatform,Maven,Maven Release Plugin,Multiplatform,我有一个工件,应该为几个目标平台构建: Linux x86 Windows x86 武器11 不幸的是,由于缺少交叉编译器,不可能一次性创建工件的所有版本 换句话说,目标是在存储库中有这样的内容 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 工件-1.0.1-arm11.zip

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

  • Linux x86
  • Windows x86
  • 武器11
不幸的是,由于缺少交叉编译器,不可能一次性创建工件的所有版本

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

  • 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
  • 工件-1.0.1-arm11.zip
请注意,这些版本是同步的。如何做到这一点

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

  • artifact-1.0.0-linux.zip
  • artifact-1.0.1-windows.zip
  • 工件-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 release,则不会增加SCM中的版本号)

  • 然后在Windows上运行

    mvn发布:准备发布:执行

    (这将增加版本号)

  • 但是,我有责任在各种平台上以适当的顺序触发发布过程。maven有没有办法帮我

    你有什么建议吗

    谢谢



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

    如我所见,您可以使用分类器(工件的文件名后缀),如
    linux
    windows
    arm11
    来区分针对特定平台的各种工件发布。因此,如果您创建由Maven管理的多模块项目,其中模块将是具有相同
    groupId
    、相同
    artifactId
    、相同
    版本
    (可能从其公共父级继承)但不同
    分类器
    的工件,您将得到您想要的东西。在这种情况下,您总是发布您的多模块POM(通常它也是其模块的公共父级),以便同时发布所有模块。假设所有模块策略的版本相同(这里似乎非常适合),您基本上可以执行:

    mvn发布:准备发布:执行-DautoVersionSubmodules


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

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

    反正

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

    1-从windows计算机执行“mvn发布:准备发布:执行”-这应该将artifact-1.0.1-windows.zip放入nexus

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

    3-从linux和arm11进行“mvn部署”(不管是什么:p)-这也应该将-linux.zip和-arm11.zip引入nexus


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

    您帮我解答了您的问题……我不知道pushChanges=false选项


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

    但我的观点是,当您在linux上时,您无法为windows创建二进制文件(由于某些工具链约束)。因此,在Linux上运行构建过程时,无法创建Windows二进制文件。反之亦然。因此,您无法一次性为所有平台创建所有二进制文件。--这不是关于如何组织成模块的问题。这是关于如何在多个平台上同步单个工件的发布过程。好吧,我担心Maven无法帮助您自动完成这项工作,除非您希望(并且有时间)创建自己的发布插件。正如您所提到的,您可以在不碰撞版本的情况下进行所有的重新发布,然后在最后对其进行全局bum,但这是您必须记住的。您还可以放弃通用版本控制(从父级继承),并在所有模块的POM中按字面意思键入版本。但是,这一次,您必须控制此过程,并确保所有模块都随版本一起发布,并且每个模块只发布一次。我真的看不到100%自动的方式。我只是在想,同步构建的最佳位置是工件库,但它需要允许将发布的工件标记为不完整(例如,仍在等待Windows工件)。但是,第一个发布过程(在Linux上运行的过程)需要声明预期会出现多少工件。是 啊太复杂了,你能用詹金斯吗?我不是Jenkins的专家,但快速浏览一下,我看到了一个关于分布式构建的页面。我会让你判断这对你的需求来说是不是太过分了。在我的例子中,Quickbuild不是Jenkins,而是正确的。这正是我将应用的解决方案。