文档章节

介绍一个 Java 程序运行时版本信息工具

罗格林
 罗格林
发布于 2017/09/12 12:00
字数 713
阅读 842
收藏 17

1. 介绍

作为应用程序尤其是框架和库的作者,常常需要了解运行程序的版本:

  1. 作为 bug 报告的关键信息
  2. 在应用启动的时候打印版本带来更加清晰的信息展示

例如下面是一个ActFramework应用项目启动时的 Banner:

ACT App Banner

针对这样的需求,我开发了一个小小的工具 (9K jar 包) 来帮助大家轻松方便地管理和访问应用/库/框架在运行时的版本信息.

2. 安装

该工具已经发行到了 maven 中央库, 可以在你的 pom 文件中加入一下依赖:

<dependency>
  <groupId>org.osgl</groupId>
  <artifactId>osgl-bootstrap</artifactId>
  <version>${osgl-bootstrap.version}</version>
</dependency>

3. 准备应用/库的版本信息

作为应用/库的开发者,你需要将软件的版本信息按照下面的方式加入到项目当中:

假设你的产品的包名是 `org.mrcool.swissknife`,你需要将一个名为 .version 的文件存放在 src/resources/org/mrcool/swissknife 目录里, 文件的内容大致如下:

# artifact is optional, if not provided the package name will be used
artifact=<delivery-name>

# version is mandatory, if not provided then UNKNOWN version will be returned
version=<the project version>

# build number is optional, if not provided then empty string will be used
build=<SCM build number, e.g. git hash>

因为不想每次发布新版都手工编辑这个文件,我们可以利用 maven 的资源过滤功能, 将上面的文件定义为一下内容:

artifact=${project.artifactId}
version=${project.version}
## build number is optional
build=${buildNumber}

同时在 pom 文件里面加上资源过滤插件:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
      <include>**/.version</include>
    </includes>
   </resource>
</resources>

另外如果需要上面的 buildNumber 的话,还需要加上 buildnumber maven plugin 插件:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>buildnumber-maven-plugin</artifactId>
  <version>${buildnumber-maven-plugin.version}</version>
  <executions>
    <execution>
      <phase>validate</phase>
      <goals>
        <goal>create</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <shortRevisionLength>4</shortRevisionLength>
  </configuration>
</plugin>

这样就可以了.只要运行 mvn package,生成出来的 jar 文件里会包含足够的版本信息.

4. 在运行时访问版本信息

假如某个库已经按照上面的方式加入版本信息到 jar 文件当中了,使用库的应用可以利用 osgl-bootstrap 里面的 Version 类来访问该库的版本, 如下面代码所示:

Version version1 = Version.of(org.mrcool.swissknife.SwissKnife.class);
System.out.println(version1.getPackage()); // print `org.mrcool.swissknife`
System.out.println(version1.getArtifactId()); // print `swissknife`
System.out.println(version1.getProjectVersion()); // print `1.0`
System.out.println(version1.getBuildNumber()); // print `ebf1`
System.out.println(version1.getVersion()); // print `r1.0-ebf1`
System.out.println(version1); // print `swissknife-r1.0-ebf1`

// Another method to get Version info
Version version2 = Version.of("org.mrcool.swissknife.db");

// If a certain library's version is SNAPSHOT, e.g. 1.0-SNAPSHOT, 
// then the version tag is decorated with `v` instead of `r`:
System.out.println(version2.getProjectVersion()); // print `1.0-SNAPSHOT`
System.out.println(version2.getBuildNumber()); // print `51b9`
System.out.println(version2.getVersion()); // print `v1.0-SNAPSHOT-51b9`
System.out.println(version2); // print `swissknife-v1.0-SNAPSHOT-ebf1`

如果访问到的库正好没有版本信息也不会出打错, Version 会返回一个 Unknown 版本实例给调用方.

最后说明一点, 该软件已经放在码云上了:

http://git.oschina.net/osglworks/java-osgl-bootstrap

© 著作权归作者所有

共有 人打赏支持
罗格林

罗格林

粉丝 290
博文 43
码字总数 41912
作品 4
其他
架构师
私信 提问
开源BI工具Metabase安装

安装Metabase: Metabase是作为Java jar文件构建和打包的,可以在有Java环境的任何地方运行。下面我们提供有关如何在各种常见配置中安装和运行Metabase的详细说明。 本篇只介绍jar安装方式,...

全科
2018/07/09
0
0
JVM之Java内存区域与内存溢出异常

Java的JVM可以自动管理内存,包括内存动态分配和垃圾收集等。 简介 JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间...

Jeffbond
2017/04/08
0
0
你的 Java 代码对 JIT 编译友好么?

JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一。但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度。 在...

oschina
2015/09/06
7.2K
12
Java 7 技术的新纪元

预计于今年秋天将最终发布的 Java 平台最新更新意义重大且倍受期待。虽然尚未通过 Java Community Process (JCP) 正式创建 Java 7 平台 Java Specification Request (JSR),并且最终特性集仍...

红薯
2010/06/07
565
2
Java平台标准版Oracle JDK 9中的新增功能

官方文档 https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6 pdf下载 https://docs.oracle.com/javase/9/whatsnew/JSNEW.pdf 原文翻译:......

两毛五哥哥
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
1
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部