原 荐 介绍一个 Java 程序运行时版本信

1. 介绍

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

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

例如下面是一个ActFramework应用项目启动时的 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 版本实例给调用方.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端生活

Linux(二十二)Ubuntu安装和配置

2106
来自专栏大数据挖掘DT机器学习

python模拟新浪微博登陆功能(新浪微博爬虫)

有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录。 浏览器访问服务器的过程 在用户访问网页时...

7845
来自专栏陈树义

如何在IntelJ下用Maven创建一个Web项目

相信一开始做Web项目的同学都是直接把项目包放在WEB-INF/lib目录下,然后就开始做项目了。但是之后接触了一些使用了Maven进行包管理的项目,我们就不得...

2636
来自专栏SpringBoot 核心技术

第十七章:使用SpringSecurity让SpringBoot项目更安全

3204
来自专栏黑白安全

8种DOS命令

  它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:...

1642
来自专栏佳爷的后花媛

SVN命令解析以及问题解决(update...)

1.Repo-browser(浏览版本库) 通过“浏览版本库”可以直接查看服务器上指定目录下的所有目录结构(需要有相关权限),包括特定版本的作者,提交时间等,...

4793
来自专栏枕边书

LINUX下的PHP

由于linux系统的稳定性,大部分的PHP服务器都被部署在linux上,而且像redis等扩展在linux能得到更好的支持,所以对于PHP程序员来说,使用lin...

2828
来自专栏DevOps时代的专栏

网络上找不到的 Jenkins 集成方案

Jenkins是一个广泛用于持续构建的可视化web工具,就是各种项目的的“自动化”编译、打包、分发部署,将以前编译、打包、上传、部署到Tomcat中的过程交由J...

1042
来自专栏极客编程

IPFS环境安装与入门教程

IPFS(InterPlanetary File System,星际文件系统)是去中心化的,本文是介绍IPFS节点软件的系统环境搭建安装与使用方法的入门教程,并...

2503
来自专栏为数不多的Android技巧

如何调试Android Native Framework

半年前写了一篇文章,介绍 如何调试Android Framework,但是只提到了Framework中Java代码的调试办法,但实际上有很多代码都是用C++实现...

2932

扫码关注云+社区