在Java应用程序中处理版本号的好方法是什么?

时间:2009-04-20 22:30:30

标签: java version

我正在使用Java和Swing Application Framework开发桌面应用程序。我有一个关于盒子的应用程序,我想让那个盒子包含一些关于正在测试的版本的指示。我倾向于以自动化方式改变该值。我正在使用CruiseControl构建从SVN提交触发的应用程序。

其他人使用什么机制来完成这项工作?是否有一个关于盒子版本号库或一组与ant相关的工具,我可以在构建过程中使用它们?

我不是在寻找部署选项或者无论如何都要自动检查更新或类似的东西。我只是想问一下测试人员在关于框中的版本是什么,并得到一个可靠的答案。

6 个答案:

答案 0 :(得分:27)

我将通过声明我使用Apache Maven构建来开始这篇文章。你也可以用Ant或其他工具做类似的事情,但这就是我用maven做的事情。

我发现处理此问题的最佳方法是使用项目版本和subversion版本作为内部版本号。从maven你可以包括以下内容。这将为您提供subversion版本号$ {scm.revision}。

<build>
    <plugins>
      <plugin>
        <artifactId>maven-scm-plugin</artifactId>
        <executions>
          <execution>
            <id>getting-scm.revision</id>
            <phase>validate</phase>
            <goals>
              <goal>update</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

然后,我将其用作jar文件清单的一部分作为实现版本。

  <plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.1</version>
    <configuration>
      <archive>
        <manifestEntries>
          <Implementation-Version>${this.version}.${scm.revision}</Implementation-Version>
        </manifestEntries>
      </archive>
    </configuration>
  </plugin>

关于这一点的好处是你可以使用以下代码从代码中访问它:

Package p = getClass().getPackage();
String version = p.getImplementationVersion();

它为您提供了完整的内部版本号,如“1.0.13525”,其中最后一个数字是颠覆修订版。有关设置此内容的详细信息,您可以查看我在这个问题上做了一段时间的完整blog post

答案 1 :(得分:7)

让构建脚本创建一个包含该版本的属性文件。从SVN直接获取修订版#是个好主意。这样你就可以在测试中引用它。将此属性文件放入打包的jar中,并在运行时读取它。我们通常将主要版本和次要版本设置为ant scrpt的参数,而SVN自动管理修订版本,并为引用提供一致的版本号。

此代码段目标运行svn命令行并输出到临时文件(svndump)。 然后构造xx.yy.zz字符串,将其放在另一个文件中,稍后将其包含在jar中。 请注意,xx.yy取自外部参数,这是主要次要版本。

<target name="getrev">
    <exec executable="svn" output="svndump">
        <arg value="info"/>
        <arg value="${my.svn.url}"/>
    </exec>

    <property file="svndump"/>
    <property name="my.build" value="${Revision}"/>
    <property name="my.rev" value="${my.ver}.${my.build}"/>
    <echo message="current revision is ${my.rev}"/>

    <property name="my.dir.dist" value="${my.dir.root}/dist/${my.rev}"/>
    <echo message="${my.rev}" file="${my.dir.projects}/revision"/>

    <delete file="svndump"/>
</target>

答案 2 :(得分:3)

使用Maven我使用buildnumber-maven-plugin从Subversion获取修订版号或使用序列或时间戳,然后用它来替换你喜欢的${buildNumber}占位符。我想其他构建工具和持续集成服务器具有类似的功能。使用“&lt; your-tool&gt;内部版本号”搜索您最喜欢的搜索引擎。

答案 3 :(得分:2)

你太复杂了。 SVN提供版本号作为宏,如CVS。

创建一个包含常量的简单inverface,并让SVN通过宏实例化,如

public interface IVersionNumber {
    public static final String version = "$Id$" ;
}

您需要告诉SVN在该文件上使用关键字,如

  

$ svn propset svn:keywords   “Id”IVersion.java

您可以阅读有关属性here的信息。

答案 4 :(得分:1)

我们已经使用JReleaseInfo很长一段时间了。您可以在Ant脚本中设置它(我们不会将Maven用于我们的项目),它会自动颠覆版本号。它还有一些很好的补充,因为它生成一个包含所有信息的类。您可以在代码中调用该类以准备好使用字符串,或者从命令行调用该类以使其打印出版本号,而无需更改任何代码。

答案 5 :(得分:0)

由于我正在使用cruise controlAnt来构建所有内容,因此我至少暂时使用传递给ant调用的${label}属性来构建项目。在我的ant文件中,我使用Ant "replace" task来更改包含名为Application.version的about box资源的属性文件,以包含该标签。

我打算从label incrementer更改为svn label incrementer,然后以这种方式使用svn修订号。它只需要更多的工作,它需要我更改巡航控制配置文件。