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

Jay*_* R. 25 java version

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

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

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

Chr*_*ail 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>
Run Code Online (Sandbox Code Playgroud)

之后,我将其用作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>
Run Code Online (Sandbox Code Playgroud)

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

Package p = getClass().getPackage();
String version = p.getImplementationVersion();
Run Code Online (Sandbox Code Playgroud)

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

  • p.getImplementationVersion(); 每次我尝试调用它时都会保持返回null (3认同)
  • 如果您不介意默认值,可以使用添加实现条目的简写.请参阅https://maven.apache.org/shared/maven-archiver/examples/manifest.html (3认同)

Dim*_*ima 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>
Run Code Online (Sandbox Code Playgroud)