25

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

其他人使用什么机制来完成这项工作?是否有我可以在构建过程中放置​​的 about box 版本号库或一组 ant 相关工具?

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

4

6 回答 6

27

我将首先说明我使用Apache Maven来构建这篇文章。您也可以使用 Ant 或其他工具做类似的事情,但这是我使用 maven 所做的。

我发现处理此问题的最佳方法是使用项目的版本加上颠覆修订作为内部版本号。从 Maven 中,您可以包括以下内容。这将为您提供作为 ${scm.revision} 的 subversion 修订号。

<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”,其中最后一个数字是颠覆修订版。有关设置的更多信息,您可以查看我不久前就这个问题所做的完整博客文章。

于 2009-04-20T22:52:22.540 回答
7

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

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

<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>
于 2009-04-20T22:41:08.167 回答
3

在 Maven 中,我使用了buildnumber-maven-plugin,它从 Subversion 获取修订号,或者使用序列或时间戳,然后用于替换${buildNumber}您喜欢的占位符。我想其他构建工具和持续集成服务器也有类似的功能。使用“<your-tool> build number”搜索您最喜欢的搜索引擎。

于 2009-04-20T22:49:40.907 回答
3

你把事情弄得太复杂了。SVN 以宏的形式提供版本号,就像 CVS 一样。

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

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

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

$ svn propset svn:keywords "Id" IVersion.java

您可以在此处阅读有关属性的信息。

于 2009-04-20T22:32:27.453 回答
1

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

于 2009-04-20T23:57:03.460 回答
0

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

我打算从标签增量器更改为svn 标签增量器,然后以这种方式使用 svn 修订号。它只是多一点工作,它需要我对巡航控制配置文件进行更改。

于 2009-04-21T13:18:52.957 回答