如何最好地在EAR中存储Subversion版本信息?

时间:2008-10-05 11:11:01

标签: java svn ant release

当收到错误报告或it-doesnt-work消息时,我的首字母问题之一始终是什么版本?由于不同的构建处于测试的许多阶段,因此规划和部署这通常是一个非常重要的问题。

我是发布Java JAR(ear,jar,rar,war)文件的情况我希望能够查看/在JAR中切换到作为发布源的相同分支,版本或标记JAR。

如何最好地调整ant构建过程,以便svn checkout中的版本信息保留在创建的构建中?

我正在思考:

  • 添加VERSION文件,但内容是什么?
  • 将信息存储在META-INF文件中,但在哪个属性下使用哪些内容?
  • 将资源复制到结果存档
  • 将svn:properties添加到所有源,其中包含编译器留下的关键字

我最终使用svnversion方法(接受的anwser),因为它扫描整个子树而不是svn info,它只是查看当前文件/目录。为此,我在ant文件中定义了SVN任务,使其更具可移植性。

<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask">
  <classpath>
    <pathelement location="${dir.lib}/ant/svnant.jar"/>
    <pathelement location="${dir.lib}/ant/svnClientAdapter.jar"/>
    <pathelement location="${dir.lib}/ant/svnkit.jar"/>
    <pathelement location="${dir.lib}/ant/svnjavahl.jar"/>
  </classpath>        
</taskdef>

并非所有构建都会导致Web服务。由于应用程序服务器中的更新,部署之前的ear文件必须保持相同的名称。使文件可执行仍然是一个选项,但在那之前我只包括一个版本信息文件。

<target name="version">
  <svn><wcVersion path="${dir.source}"/></svn>
  <echo file="${dir.build}/VERSION">${revision.range}</echo>
</target>

参考文献:
svnrevision:http://svnbook.red-bean.com/en/1.1/re57.html
svn info http://svnbook.red-bean.com/en/1.1/re13.html
subclipse svn任务:http://subclipse.tigris.org/svnant/svn.html
svn客户端:http://svnkit.com/

9 个答案:

答案 0 :(得分:5)

使用Ant脚本中的 svnversion 命令获取修订号:

<exec executable="svnversion" outputproperty="svnversion" failonerror="true">
  <env key="path" value="/usr/bin"/>
  <arg value="--no-newline" />
</exec>

然后在EAR中的某处使用 $ {svnversion} 属性。我们将它放在EAR文件名中,但您也可以将它放在EAR内的自述文件或版本文件中,或者在EAR的 META-INF / manifest.mf 中指定版本:

<!-- myapp-r1234.ear -->
<property name="ear" value="myapp-r${svnrevision}.ear" />

答案 1 :(得分:4)

您想要提供Subversion分支和存储库编号。正如How to access the current Subversion build number?中所讨论的,svn info命令将为您提供此信息,然后您可以使用它来构建VERSION文件或放置在您构建到* AR文件中的任何其他文件中。如果您没有其他想法,可以考虑使用XmlProperty Ant task从您的输出中提取相关信息 svn info --xml命令

答案 2 :(得分:3)

查看jreleaseinfo项目。包含一个ANT任务,可以生成一个可在运行时调用的java类,以显示项目的发布信息。

我喜欢它的简洁性。

答案 3 :(得分:2)

另请参阅此问题:Build and Version Numbering for Java Projects (ant, cvs, hudson)

它包含几个有用的代码段。

答案 4 :(得分:1)

从我的头脑中。每个jar构建的标签?

答案 5 :(得分:1)

我们的构建的第一部分在包的根目录中创建了一个version.txt文件并转储用于检查代码的标记(在我们的例子中)CVS ...另外,我们的最后一部分构建过程将完全构建的EAR检入CVS以供将来参考。

这样,如果我们遇到一个webapp问题 - 只是要求记者点击/app/version.txt - 从那里我们可以深入查看CVS中的特定构建历史以找到相关组件(处理应用程序中不同版本的库)以找到错误。

不确定这对我们的支持人员有多大帮助 - 但他们肯定抱怨在那里!

答案 6 :(得分:1)

自动构建,并在构建成功时在代码库上放置一个标记(带有日期戳)(使用unittest ofcourse)。

在您的交付流程中,仅向客户提供已标记的构建。这样你就可以控制了,可以将标记名放在某个地方的readme.txt中,或者让ear文件的文件名反映标记名。

我亲自切换回CVS,这也是其中一个原因。在CVS中,我可以有一个类报告它的标签。我的所有jar文件都包含一个“main”,使它们可以运行。有了支持问题,我请客户做一个“java -jar somejar.jar”并将输出发送给我。

这样我就可以确定他们正在使用的构建,我甚至可以获得java版本,操作系统类型和版本等信息。没有客户必须回答奇怪的问题。

这很简单但非常有效。

答案 7 :(得分:1)

为什么不将构建号放入属性文件中......然后可以通过java轻松读取并输出到帮助|关于对话框(小应用程序/应用程序),网页页脚或您可能拥有的任何其他GUI。

(请参阅每个SOF页面上的页脚....那里有SVN版本号。)

看起来容易比看WAR / EAR / JAR等容易的时间?

答案 8 :(得分:0)

我将绝对存储库修订存储为我的完整版本号的一部分。这使人们可以快速浏览一下给定的更改是否属于给定版本。

我们还将版本号/构建日期/等存储在耳朵的清单文件中作为自定义属性,这些只是信息性的。我们还将它存储在jar中内置的属性文件中,因此应用程序可以读取它。