【问题标题】:Automatically incrementing a build number in a Java project在 Java 项目中自动增加内部版本号
【发布时间】:2012-01-24 14:21:58
【问题描述】:

我正在使用由 a.b.build 表示的版本控制系统,其中 a 是整体版本(原型、alpha 和 beta 版本为 0,主要版本为 1),b 是里程碑版本(沿着表示 proto、alpha、beta 阶段),build 表示项目已编译的次数。

目前,我让应用程序从文本文件中读取,增加数字,并在应用程序运行并设置调试标志时保存到文本文件中。

我正在寻找一种更“正确”的方式来使用 Java 和 Netbeans。有什么方法可以在某处将构建编号注入构建过程中吗?最好将数字保存到项目附带的源文件中 - 而不是依赖附近文件的存在。

【问题讨论】:

  • 为什么 build 必须是序列号?为什么构建文件的哈希值不够?
  • @MikeSamuel 通常是因为增量版本号对人们来说更容易('这个版本更新')

标签: java maven versioning


【解决方案1】:

有几个流行的 Maven 插件可以完成这一壮举:

来自 Apache Maven 项目的 Maven 发布插件有点 overkill 用于简单地更新版本号。因此use the latter 插件创建版本号(以 MAJOR.MINOR.BUILD 的形式;例如,3.1.4 其中4 是自动递增的)如下:

  1. 打开项目的pom.xml 文件。
  2. 将插件包含在build 部分(在dependencies 部分之后):
  <scm>
    <connection>scm:svn:http://127.0.0.1/dummy</connection>
    <developerConnection>scm:svn:https://127.0.0.1/dummy</developerConnection>
    <tag>HEAD</tag>
    <url>http://127.0.0.1/dummy</url>
  </scm>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.4</version>
        <executions>
          <execution>
            <id>buildnumber</id>
            <phase>validate</phase>
            <goals>
              <goal>create</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <format>{0,number}</format>
          <items>
            <item>buildNumber</item>
          </items>                    
          <doCheck>false</doCheck>
          <doUpdate>false</doUpdate>
          <revisionOnScmFailure>unknownbuild</revisionOnScmFailure>   
        </configuration>
      </plugin>    
    </plugins>
    <finalName>${project.artifactId}-${project.version}.${buildNumber}</finalName>
  </build>
  1. 确保pom.xml 在文件顶部附近的版本元素中定义主要和次要版本。例如:
<version>3.1</version>
  1. 保存pom.xml 文件。
  2. 重建项目。

版本号应该增加。


该插件需要一个已配置的源代码管理存储库 (&lt;scm&gt;) 元素。如果您不关心存储库签入编号,请改用dummy scm。这可用于包含存储库中的修订号,这是reader 的练习。

【讨论】:

  • buildnumber-maven-plugin 的最后一次提交是在 6 年前的 2015 年。我很好奇这是否会作为长期解决方案继续运作良好。
  • 尽可能远离 Maven。 Gradle 有一个 plugin 可以直接从 Git 读取版本号。由于通过存储库对应用程序进行标记和版本控制是 SDLC 的一部分,leveraging that ability 意味着不必在两个地方维护版本号的任何部分。 (给出的答案可能会在未来一段时间内奏效。)
  • 是的.. 我不知道,我刚刚发现了这个:mojohaus.org/versions-maven-plugin/usage.html。 - 而且 Maven 和 Gradle 仍然是维护得相当严格的行业标准工具。
【解决方案2】:

您可以使用当前分支的 git commit count 作为内部版本号。使用此命令行获取提交计数:git rev-list HEAD --count

与构建工具集成将非常简单。如果你使用 Gradle,那么你可以使用这个插件:https://github.com/rockerhieu/Versionberg/

【讨论】:

    【解决方案3】:

    借助 maven 插件和脚本,您无需修改​​ pom 即可做到这一点。

    例如,要自动增加没有快照作为前缀的版本的第二个数字,就像你的情况一样,在 linux 系统上你可以这样做:

    #get the current pom version and store it into a variable
    version=$(mvn -q -U -Dexpression=project.version -DforceStdout maven-help-plugin:evaluate)
    #increment the second digit of the version and overwrite the variable
    version=$(echo ${version} |  awk -F'.' '{print $1"."$2+1"."$3}' |  sed s/[.]$//)
    #update the pom with the new version
    mvn -U versions:set -DnewVersion=${version}
    

    由于 sed,它适用于 3 位数字和 2 位数字的版本。
    当然,将默认增量部分:"+1" 移到适合您要求的数字上:

    # increment the first digit
    awk -F'.' '{print $1+1"."$2"."$3}'
    
    # increment the second digit
    awk -F'.' '{print $1"."$2+1"."$3}'
    
    # increment the last digit
    awk -F'.' '{print $1"."$2"."$3+1}'
    

    【讨论】:

      【解决方案4】:

      现在我建议避免使用 Maven Release 插件,以及其他答案中提到的各种手工黑客。

      在源代码级别导致文件更改的任何事情都会创建新的提交,因此会不必要地污染您的版本历史记录。

      唯一应该负责管理源代码版本号的是您的版本控制管理系统。 换句话说,Git。

      好消息是有一些非常好的选项可用,这些工​​具可以让你的 git 标签控制版本编号,而不是相反。

      在您的情况下,我推荐的是jgitver,它以插件的形式支持 Maven 和 Gradle 设置,并且非常可配置。

      您需要做的就是将一些文件添加到项目的根目录,对其进行配置,然后将 pom.xml 中的版本号设置为 0。完成。 请在此处查看jgitver usage

      【讨论】:

        【解决方案5】:

        我有一些问题并使用“Dave Jarvis”的答案。这会将正确的版本和内部版本号添加到本地生成的 jar 文件中,例如:myProject-3.1.1234.jar。但是在 maven 存储库中,工件被安装为版本“3.1”而不是(我预期的)“3.1.1234”。内部版本号仍然丢失...

        要将工件安装到具有正确版本和内部版本号(“3.1.1234”)的 maven 存储库中,您必须这样做(除了“Dave Jarvis”的答案):

        1. 添加主要/次要版本属性:
        <properties>
          <!-- !!!!!!!!! SETTING HERE THE CORRECT MAJOR/MINOR VERSION NUMER !!!!!!!!!! -->
          <major.minor.version>1.0</major.minor.version>
        </properties>
        
        1. 使用nashorn-maven-plugin:为工件设置正确的版本号:
        <!-- set "major.minor.revision" version -->
        <plugin>
          <groupId>io.github.michaldo</groupId>
          <artifactId>nashorn-maven-plugin</artifactId>
          <version>0.0.1</version>
          <executions>
            <execution>
              <phase>validate</phase>
              <goals>
                <goal>eval</goal>
              </goals>
              <configuration>
                <script>
                  $project.artifact.version = "${major.minor.version}.${buildNumber}";
                </script>
              </configuration>
            </execution>
          </executions>
        </plugin>    
        

        重建/安装项目后,工件将作为版本“3.1.1234”在 maven 存储库中:-)

        请注意:要增加主要或次要版本,您只能更改 major.minor.version 属性!

        【讨论】:

          【解决方案6】:

          在需要增加构建的用例之前,通过 CI/CD 工具使用版本 maven 插件!

          https://www.mojohaus.org/versions-maven-plugin/usage.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-27
            • 1970-01-01
            • 1970-01-01
            • 2011-08-21
            • 2011-03-06
            • 1970-01-01
            • 2010-11-02
            相关资源
            最近更新 更多