在Java项目中自动递增构建版本号

40
我正在使用一个版本控制系统,其表示为a.b.build,其中a是整体版本(原型、alpha和beta版本将为0,主要发布版本将为1),b是里程碑版本(代表原型、alpha、beta阶段),而build则是项目编译的次数。
目前,我使应用程序从文本文件中读取数据,增加该数字,并在设置了调试标志的情况下将其保存到文本文件中运行应用程序时。
我正在寻找一种更“正确”的使用Java和Netbeans的方法。是否有一些方法可以将构建编号器注入到构建过程中?最好将该数字保存到与项目一起发布的源文件中,而不是依赖于附近文件的存在。

为什么构建必须是一个序列号?为什么构建文件的哈希值不足以满足要求? - Mike Samuel
2
请参见以下网址:https://dev59.com/Reo6XIcBkEYKwwoYTzNK - andersoj
5
通常情况下,增量版本号对于人们来说更容易理解(“这个构建版本更新了”)。 - Mark Rotteveel
6个回答

33

有几个流行的Maven插件可以完成这项任务:

Apache Maven项目的Maven Release插件对于仅更新版本号来说有点过度。因此,使用后者插件创建一个版本号(以MAJOR.MINOR.BUILD的形式,例如3.1.4,其中4是自动递增)如下:

  1. 打开项目的pom.xml文件。
  2. dependencies部分之后,在build部分中包含插件:
  <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>

请确保pom.xml文件中在版本元素的顶部定义了主要和次要版本号,例如:
<version>3.1</version>
  1. 保存 pom.xml 文件。
  2. 重新构建项目。

版本号应该会增加。


该插件需要一个已配置的源代码管理存储库(<scm>)元素。如果您不关心存储库的检入号,请改用虚拟 scm。这可用于包含来自存储库的修订号,这是读者的练习。

buildnumber-maven-plugin在2015年进行了最后一次提交。我很好奇这是否会作为长期解决方案继续正常工作。 - TheJeff
如果可能的话,请远离Maven。Gradle有一个插件(https://plugins.gradle.org/plugin/com.palantir.git-version),可以直接从Git中读取版本号。由于通过存储库对应用程序进行标记和版本控制是SDLC的一部分,因此利用该功能意味着不必在两个位置维护任何版本号的部分。(如所述的答案,可能会在未来一段时间内起作用。) - Dave Jarvis
是啊,我也不知道,我只是找到了这个:https://www.mojohaus.org/versions-maven-plugin/usage.html。而且Maven和Gradle都是被广泛维护的行业标准工具。 - TheJeff
它应该做什么?对我来说,它会创建一个名为 buildNumber.properties 的文件并增加其中的一个数字。它不会增加 pom 中的构件版本。 - Dims

5
现在我建议避免使用Maven Release插件,以及其他答案中提到的各种手工hack。
任何导致源代码级别文件更改的东西都会创建新的提交,因此会不必要地污染您的版本历史记录。
唯一应该负责管理源代码版本号的是您的版本控制管理系统。 换句话说,就是Git。
好消息是有几个非常好的选择可用,这些工具将使您的git标签控制版本编号,而不是反过来。
在您的情况下,我推荐jgitver,它支持Maven和Gradle设置,形式为插件,并且非常可配置。
您需要做的就是向项目根目录添加一些文件,按照自己的喜好进行配置,并在pom.xml中设置版本号为0。完成。 请参见jgitver usage

5

利用Maven插件和脚本,您可以在不修改pom的情况下完成此操作。

例如,在Linux系统上自动增加版本号的第二个数字(如果该版本号没有snapshot作为前缀,就像在您的情况下):

#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

您可以将当前分支的git提交计数用作构建号。 使用以下命令行获取提交计数:git rev-list HEAD --count

与构建工具集成将非常简单。 如果您正在使用Gradle,则可以使用此插件:https://github.com/rockerhieu/Versionberg/


2
我遇到了与“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>

使用 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”属性!

对于拥有多个模块并避免为每个模块创建不同构建编号的用户,请查看此链接:https://stackoverflow.com/questions/9096279/turn-off-buildnumber-maven-plugin-for-submodules - ashah

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接