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

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

别人用什么机制来完成这项工作? 是否有一个关于盒子版本号库或一组ant相关工具,我可以在构建过程中放置​​到位?

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

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

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

   maven-scm-plugin   getting-scm.revision validate  update       

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

   maven-jar-plugin 2.1    ${this.version}.${scm.revision}     

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

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

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

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

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

              

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

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

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

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

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

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

您可以在这里阅读有关房产

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

由于我使用巡航控制和Ant来构建所有内容,所以我至少暂时使用传递给ant调用的$ {label}属性来构建项目。 在我的ant文件中,我使用Ant “替换”任务来更改包含名为Application.version的about box资源的属性文件以包含该标签。

我打算从标签增量器更改为svn标签增量器 ,然后使用svn修订号。 它只需要更多的工作,它需要我更改巡航控制配置文件。