没有标记或编译的 Maven 发布

Maven Release Without Tagging or Compiling

我正在尝试使用 Maven 构建 JNI 项目,但我 运行 在创建 GA 版本时遇到了一些困难。由于原生代码要求,项目的原生代码至少需要在3个系统(Linux、OSX、Windows)上编译。当我在 GitHub 上创建标签时,我还希望 GitHub 操作生成发布版本。因此,我在使用 maven 发布插件时遇到了很多问题。似乎 Maven 的发布过程涉及编译和测试代码以及​​在我可以创建 GA 版本和发布之前与 SCM 搞混。这对于这个 JNI 项目来说根本不可能。我已经使用 Ant 走上了交叉编译器的道路,出于各种原因,我真的很想放弃它,主要是与 Apple 相关。我还考虑过单独发布每个 JNI 目标,但我真的很想将本机代码捆绑在 JAR 中,当我需要在不同的构建环境中共享一个 .m2 文件夹时,事情开始变得复杂起来。是否可以在没有所有编译、测试和 SCM 废话的情况下发布 Maven 项目?也许是不同的第 3 方插件?有没有更好的方法我应该这样做?作为参考,可以找到 pom here

不要使用发布插件,我使用 maven version plugin 获得了更多成功。

maven 发布插件所做的就是从快照中删除版本,创建新的提交,然后将版本升级到新的增量快照。您可以模拟此过程,而 maven 无需了解有关您的 SCM 使用版本的任何信息。

一种方法是不 SNAPSHOTS 而是使用 git 短散列作为版本的一部分进行构建:

所以在开发的时候,版本看起来很正常

    <groupId>org.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.1.0</version>

"release" 基于标签构建。我的流量是

  • 提交并推送
  • 构建 - mvn clean install,结果为 my-app-1.1.0.jar
  • 部署到测试环境和 运行 回归测试,如果它们成功,我们用 "passed_tests" 标签标记提交
  • CI 在匹配 "passed_tests" 的标签上触发 - 这需要与导致被测 jar 的提交相同
    • 运行s mvn -f ./pom.xml versions:set -DnewVersion=${gitProps['git.build.version']}_${gitProps['git.commit.id.abbrev']} 在磁盘上,我们的 maven 版本现在是:
    <groupId>org.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.1.0-abcdef</version>
  • 然后 运行s mvn deploy。这是部署到 repo 的工件,现在我们有一个版本与 git 提交匹配的 jar 文件(或其他文件)。

您可以对所有目标架构使用相同的过程。