`

版本信息那些事

    博客分类:
  • Java
阅读更多

在做产品时,我们经常会遇到这样的需求:

  • 打Jar包时,需要压入产品的版本信息,甚至还有版权信息。
  • 在运行时,程序需要读取版本信息来做显示或者做分支处理。
向下兼容的一种实现方式是读取版本信息来做分支处理...Lucene是这种方式的代表之一。
版本信息的运行时获取的实现手段非常有限,大多使用 java.lang.Package来实现。

 

一、最简单的实现方式 - manifest

public class VersionInfo {

	public static String getVersion() {
		Package pkg = VersionInfo.class.getPackage();
		return (pkg != null ? pkg.getImplementationVersion() : null);
	}

}

这也是Spring的实现方法,但关键是版本信息的元数据来自哪里?这些信息存于Jar包内的MANIFEST.MF文件。该文件用于描述jar的情况,具体请见:http://baike.baidu.com/view/1857179.htm

 

这些属性中,和版本信息相关的属性是:

Implementation-Version: xxxx

 

 

 

二、ANT + manifest

思路是在build.xml里建立一个存放版本号的属性,并在打Jar包时,将版本号压入MANIFEST文件。程序在执行的时候,读取Jar包的MANIFEST来获取版本号。获取MENIFEST文件内版本号的方法没有任何改变,参考上一节。

 

build.xml

使用Eclipse自动生成build.xml后,在build.xml内增加这么几行:

	<property name="binary.version" value="1.0-SNAPSHOT" />

	<target name="package" description="package a jar" depends="cleanall, build-project">
		<jar jarfile="target/binary_version.jar" basedir="eclipse-build">
			<manifest>
				<attribute name="Implementation-Version" value="${binary.version}" />
				<attribute name="Main-Class" value="com.joshua.version.YourService" />
			</manifest>
		</jar>
	</target>

 

第一行是存放版本号的字段。名为package的target则负责把版本号压入manifest并制作jar包。

*注意:我存放class文件的目录是eclipse-build,大家需要把这个路径改成自己的目录(一般都是bin)

 

使用ant package命令打包,Jar包会生成在工程根目录下的target文件夹下。使用命令:java -jar binary_version.jar执行。就可以看到控制台上打印出来的版本信息了。

 

*注意:上述方式有个问题,就是不打包的情况下(比如在IDE里执行),是获取不到版本号的。

  

带SVN版本号的版本信息

当然现实的情况不可能这么简单,版本信息一般会带上Revision。比如,SVN的版本号。针对SVN,我们可以在build.xml里加个target:

  <target name="svnCheck" description="Use SVN to get the current revision" unless="disable-svnCheck">
    <exec executable="svn" logerror="true" outputproperty="svn.exec.result" failonerror="true" failifexecutionfails="true">
      <arg line="info"/>
    </exec>
    <loadresource property="svn.revision">
      <string value="${svn.exec.result}"/>
      <filterchain>
        <linecontains>
          <contains value="Last Changed Rev: "/>
        </linecontains>
        <tokenfilter>
            <!-- Remove all but the revision number -->
            <replaceregex pattern=".*: " replace=""/>
        </tokenfilter>
        <striplinebreaks/>
      </filterchain>
    </loadresource>
    <echo level="info" message="svn.revision=${svn.revision}"/>
  </target>

 

三、使用Annotation来实现

这种方式,我在Hadoop的源码中看到过,虽然繁琐,不过也挺有意思。优点是在非打包情况下也能工作。思路是定义1个Package级的annotation,annotation里定义了版本等属性。然后使用脚本自动获取版本信息并生成package-info.java,通过package-info传递Annotation的所有参数(包括版本信息),并且指定包名。在代码中使用反射获取被指定包的这个annotation,来获取版本信息。关于package-info的介绍,我这里就不做介绍了,google一下你就知道。

 

 

Annotation

 

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PACKAGE)
public @interface HadoopVersionAnnotation {
 
  /**
   * Get the Hadoop version
   * @return the version string "0.6.3-dev"
   */
  String version();
  
  ...
}

 

 生成package-info的脚本我就不给了,因为不同项目实现也不同。下面给出被生成的package-info.java:

@HadoopVersionAnnotation(version="1.0.3"...【省略其他属性】)
package org.apache.hadoop;

 

接着,在代码里可以使用如下方式获取版本信息:

    myPackage = HadoopVersionAnnotation.class.getPackage();
    version = myPackage.getAnnotation(HadoopVersionAnnotation.class);

 

 按上述方式,如果使用shell来生成package-info,那么我仍需要获取到软件的版本信息。版本可能源于SVN,或者GIT等等。下面提供些shell脚本供大家参考。

 

获取git的revision:

revision=`git log -1 --pretty=format:"%H"`

 

获取git的branch名

branch=`git branch | sed -n -e 's/^* //p'`

 

获取SVN的revision

revision=`svn info | sed -n -e 's/Last Changed Rev: \(.*\)/\1/p'`

 

 

 

分享到:
评论

相关推荐

    所有浏览器版本信息查询

    这是我闲来无事写的一个很没有技术含量的小脚本,只是对于那些想知道自己浏览器信息的朋友们有所帮助。

    嵌入式网络那些事(可复制版)

    《嵌入式网络那些事》简易描述了嵌入式网络的开发过程,是嵌入式初学者快速入门的必备书籍 可编辑版本,已转换成文本格式,可以直接拷贝内容信息。

    政企信息管理系统BAMS v2.0.zip

    增删改查一键生成,别去做那些重复的事了,让我们把更多的时间留在对业务的分析优化上。 希望BAMS能够对那些正在或即将开发自己团队的J2EE应用快速开发平台的个人或公司能有所启发!   交流QQ群:306624464   ...

    IIS6.0 IIS,互联网信息服务

    Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。最初是Windows NT版本的可选包,随后内置在Windows 2000、Windows XP Professional和...

    企业安全建设中渗透测试的那些技术事.pdf

    演讲大纲 测试卖靓号QQ骗子网站服务器纪实 渗透测试某知名中国内网 ...利用CVE-2014-6332IE全版本漏洞测试邻居XP电脑 实战入侵邻居安卓手机 多种方法免杀metasploitpayload 简述如何有效防御各类漏洞攻击

    yii2中关于加密解密的那些事儿

    比如,我们需要存储一些信息到我们的数据库中,但是,我们需要保证只有拥有安全秘钥的人才能看到它(即使应用的数据库泄露)。 大家也都知道,我们做程序的时候,加密解密是绕不开的话题,使用yii2开发应用的时候,...

    lvgl-8.3.0版本自定义列表文件浏览器控件

    2、添加filelist控件文件信息链表节点(添加一个文件)ccomflist_node_add 3、关闭(销毁)文件列表控件flistccom_filelist_close 4、注册文件列表控件flist,选中和删除回调注册ccom_filelist_cb_register

    关于ADB的Android Debug Bridge(安卓调试桥)那些事

    如果ADB安装成功,则会打印版本信息。 3. 判断其它环境问题: 因各种原因(包括数据线其实是根充电线,USB接口有积灰导致接触不良等等)会造成手机无法与ADB实际链接。判断ADB能否联通手机,在 cmd 命令窗口中输入 ...

    象过河企业管理软件终身免费版

    也希望我们的免费软件能帮到那些还在辛勤劳作的朋友们,早日实现信息化、自动化,不再为做账、做报表而日日夜夜的加班。 【更新日志】 象过河进销存软件 v6.2.216 免费版版本更新: 1,在查询中心的库存查询中,...

    jprofiler6,带SN

    有了上面那些信息对于系统的调优会有很大帮助。这里提供有几篇文章供参考:获取、介绍,简单入门,使用JProfiler解决实际问题。这几篇文章基本介绍了常见东西了,下面说点心得。 JProfiler监控是要消耗系统资源的...

    Aspose.word for .NET 18.7.7z

    2、保留PCL中的PaperTray信息 3、添加了ShapeBase.IsLayoutInCell属性 4、实现元文件渲染矢量输出的优化 5、“DrawingML形状不完全支持”警告不再被抛出,在渲染时使用更具体的警告 6、具有自动调整大小和空白...

    DirectX_Repair_V3.7_增强版.zip

    答:该功能是调用了系统自带的DirectX诊断工具,该工具可以检测诸如系统支持的最高DirectX版本等基本信息,并且可以检测软件、硬件以及驱动是否存在问题。检测的信息可以有助于修复您的问题。如果您对这些信息不甚...

    象过河软件免费版 V6.1.197

    也希望我们的免费软件能帮到那些还在辛勤劳作的朋友们,早日实现信息化、自动化,不再为做账、做报表而日日夜夜的加班。 象过河免费版没有时间和数据大小的限制,可以长期使用,可以无限量数据输入,大家可放心选择...

    象过河软件免费版V6.1.194

    也希望我们的免费软件能帮到那些还在辛勤劳作的朋友们,早日实现信息化、自动化,不再为做账、做报表而日日夜夜的加班。 象过河免费版没有时间和数据大小的限制,可以长期使用,可以无限量数据输入,大家可放心选择...

    象过河进销存免费版

    也希望我们的免费软件能帮到那些还在辛勤劳作的朋友们,早日实现信息化、自动化,不再为做账、做报表而日日夜夜的加班。 象过河免费版没有时间和数据大小的限制,可以长期使用,可以无限量数据输入,大家可放心选择...

    McAfee 8.0 简体中文

    但是,它们也可能会阻挡那些依 靠将文件推入工作站进行工作的管理系统。例如,在 ePolicy Orchestrator 服务器部署代理时,就是将代理安装程序推送到工 作站的管理共享资源上并运行该程序。在部署之前,请...

    象过河进销存财务管理软件免费版 V6.1.194

    中国的企业情况多种多样,很多在中小企业工作的朋友们深有体会,在信息化如此发达的今天,因为...也希望我们的免费软件能帮到那些还在辛勤劳作的朋友们,早日实现信息化、自动化,不再为做账、做报表而日日夜夜的加班。

    Bds-Maneger:Minecraft基岩服务器的经理

    那些不想让命令和东西写在黑屏上的人可以使用GUI来帮助解决这些问题。 Bds管理员GUI旨在帮助使用服务器时保持游戏安全。 帮助我们的一件事是使备份不仅可以启动,还可以发送命令:安全地停止,启动和重新启动服务器...

    跟我学 SQL ——基本结构化查询语言

    SQL数据库是怎么回事? SQL(结构化查询语言)就是负责与ANSI维护的数据库交互的标准。最新的版本是SQL-99,还有一个新标准SQL-200n尚处于制定过程中。大多数的数据库都至少遵守ANSI-92标准的部分子集。不过,目前...

Global site tag (gtag.js) - Google Analytics