当收到错误报告或it不工作消息时,我的首字母问题之一总是什么版本?由于不同的构建处于测试、规划和部署的许多阶段,这通常是一个无关紧要的问题。
在发布Java JAR(ear、JAR、rar、war)文件的情况下,我希望能够查看JAR并切换到作为发布的JAR源的同一分支、版本或标记。
如何最好地调整ant构建过程,以便svn签出中的版本信息保留在创建的构建中?
我当时的想法是:
- 添加VERSION文件,但包含什么内容
- 将信息存储在META-INF文件中,但在哪个属性下使用哪个内容
- 将源复制到结果存档
- 将svn:属性添加到所有源中,并在编译器保留的位置添加关键字
我最终使用了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信息http://svnbook.red-bean.com/en/1.1/re13.html
subclipse svn任务:http://subclipse.tigris.org/svnant/svn.html
svn客户端:http://svnkit.com/
使用Ant脚本中的svnversion命令获取修订号:
<exec executable="svnversion" outputproperty="svnversion" failonerror="true">
<env key="path" value="/usr/bin"/>
<arg value="--no-newline" />
</exec>
然后在EAR中的某个位置使用${sversion}属性。我们把它放在EAR文件名中,但您也可以把它放进EAR内的自述文件或版本文件中,或者在EAR的META-INF/manifest.mf中指定版本:
<!-- myapp-r1234.ear -->
<property name="ear" value="myapp-r${svnrevision}.ear" />
您需要提供Subversion分支和存储库编号。如"如何访问当前Subversion内部版本号?"中所述?,svn info
命令将为您提供这些信息,然后您可以使用这些信息来构建VERSION文件或将其放置在您正在构建的*AR文件中的任何其他文件中。如果您没有其他想法,可以考虑使用XmlPropertyAnt任务从svn;信息--xml命令
查看jreleaseinfo项目。包含一个ANT任务,该任务可以生成一个java类,该类可以在运行时调用以显示项目的发布信息。
我喜欢它的简洁。
另请参阅此问题:Java项目的构建和版本编号(ant、cvs、hudson)
它包括几个有用的代码片段。
来自我的脑海。每个jar构建的标签?
我们让构建的第一部分在包的根目录中创建一个version.txt文件,并转储用于从(在我们的情况下)CVS中检出代码的标记。。。此外,我们构建过程的最后一部分将完全构建的EAR检查回CVS中,以供将来参考。
这样,如果我们的网络应用程序有问题——这只是一个要求报告者点击/app/version.txt的例子——从那里我们可以深入CVS中的特定构建历史,以定位相关组件(处理应用程序中不同版本的库),从而定位错误。
不确定这对我们的支持者有多大帮助,但这肯定是他们抱怨的而不是在那里!
进行自动构建,并在构建成功时在代码库上放置一个标记(带有日期戳)(当然是单元测试)。
在交付过程中,只向客户交付标记的构建。通过这种方式,您可以进行控制,并可以将标记名放在readme.txt中的某个位置,或者让ear文件的文件名反映标记名。
我个人又回到了CVS,这也是原因之一。在CVS中,我可以有一个类报告它的标记。我所有的jar文件都包含一个"main",这使它们可以运行。对于支持问题,我要求客户做一个"java-jarsomejar.jar",并将输出与问题一起发送给我。
通过这种方式,我确信他们正在使用的构建,我甚至可以获得java版本、操作系统类型和版本等信息。客户不必回答奇怪的问题。
它很简单,但非常有效。
为什么不将内部版本号放入属性文件中。。。然后,java可以很容易地读取它,并将其输出到"帮助|关于"对话框(小程序/应用程序)、网页页脚或您可能拥有的任何其他GUI。
(请参阅每个SOF页面的页脚……那里有SVN版本号。)
看起来加载比在WAR/EAR/JAR等中查找容易吗?
我将绝对存储库修订作为完整版本号的一部分进行存储。这让人们可以快速浏览给定的更改是否在给定的版本中。
我们还将版本号/构建日期等作为自定义属性存储在ear的清单文件中,这些属性大多只是信息性的。我们还将它存储在jar中内置的属性文件中,以便应用程序可以读取它