方案1
在应用项目中,如果应用程序需要获取当前程序的版本号,可以读取”/META-INF/maven/${groupId}/${artifactId}/pom.properties“,获取maven生成的版本信息。 
当然前提用应用程序在运行时得知道自己的groupId和artifactId,否则无法定位路径。

pom.properties内容示例

#Created by Apache Maven .5.0
version=1.0.4-SNAPSHOT
groupId=com.gitee.l0km
artifactId=facelog-service

这种方法很简单,但也有缺点: 
貌似这种方法只能获取maven默认定义${project.version},无法加入自定义的信息。

方案2
还有一个方案就是直接将版本信息写入MANIFEST.MF。通过java.util.jar.Manifest来读取解析MANIFEST.MF来获取版本号。 
如下增加buildnumber-maven-plugin插件,并给maven-jar-plugin插件指定写入MANIFEST.MF的参数。

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifestEntries>
<!-- 项目版本号 -->
<Project-Version>${project.version}</Project-Version>
<!-- buildnumber插件提供的 SCM(git/svn等)版本号 -->
<Scm-Version>${buildNumber}</Scm-Version>
<!-- 时间戳 -->
<Timestamp>${maven.build.timestamp}</Timestamp>
</manifestEntries>
</archive>
</configuration>
</plugin>

方案3
前面两种方案,都需要将应用程序打成jar包才能读取版本信息。 
那么程序在开发调试的时候,并没有生成pom.properties,和MANIFEST.MF,也就无法读取版本信息了。 
所以另一种思路就是用 template-maven-plugin插件让maven自动生成一个包含版本信息的代码如Version.java。这样任何时候,程序都能很方便的知道自己的版本号了。

模板
首先需要一个代码模板Version.java,示例如下:

package net.gdface.facelog.service;
public final class Version {
/** project version */
public static final String VERSION = "${project.version}";
/** SCM(git) revision */
public static final String SCM_REVISION= "${buildNumber}";
/** SCM branch */
public static final String SCM_BRANCH = "${scmBranch}";
/** build timestamp */
public static final String TIMESTAMP ="${buildtimestamp}";
}

模板放在/src/main/java/java-templates/${package_of_template}/下

原本在模板文件中用maven内置变量${maven.build.timestamp}做时间戳,实际运行并没有被正确替换,不知道原因。所以改为使用buildnumber-maven-plugin插件(goal create-timestamp)生成的时间戳${buildtimestamp}

插件
然后修改pom.xml增加 template-maven-plugin插件和buildnumber-maven-plugin插件

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<id>bn1</id>
<goals>
<!-- 创建${buildNumber} -->
<goal>create</goal>
</goals>
</execution>
<execution>
<id>bn2</id>
<goals>
<!-- 创建时间戳${buildtimestamp} -->
<goal>create-timestamp</goal>
</goals>
<configuration>
<!-- 指定时间戳变量名 -->
<timestampPropertyName>buildtimestamp</timestampPropertyName>
<!-- 指定日期格式 -->
<timestampFormat>yyyy-MM-dd HH:mm:ss</timestampFormat>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>templating-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>filter-src</id>
<goals>
<goal>filter-sources</goal>
</goals>
</execution>
</executions>
</plugin>

template-maven-plugin插件会将/src/main/java/java-templates/文件夹下的所有模板中的${xxx}占位符都用maven中同名的变量替换一遍, 
生成的Version.java在${project.build.directory}/generated-sources/${package_of_template}下,并且该文件夹会自动成为源码文件夹加入编译过程。

参考资料
《Generate a Version.java file in Maven》

maven:读取程序版本号的三种方案的更多相关文章

  1. MySQL冗余数据的三种方案

    一,为什么要冗余数据 互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量. 水平切分会有一个patition key,通过patition key的查询能够直接定位到库,但是非pa ...

  2. 进程,多进程,进程与程序的区别,程序运行的三种状态,multiprocessing模块中的Process功能,和join函数,和其他属性,僵尸与孤儿进程

    1.进程 什么是进程: 一个正在被运行的程序就称之为进程,是程序具体执行的过程,是一种抽象概念,进程来自操作系统 2.多进程  多个正在运行的程序 在python中实现多线程的方法 from mult ...

  3. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...

  4. SP避免Form重复提交的三种方案

    SP避免Form重复提交的三种方案  1) javascript ,设置一个变量,只允许提交一次.   <script language="javascript">  ...

  5. [Linux]三种方案在Windows系统下安装ubuntu双系统(转)

    在学习linux的过程中,ubuntu无疑是初学者的最佳选择. 下面来列举给Windows系统安装ubuntu双系统的三种方法. 一.虚拟机安装(不推荐) 使用工具:Vmware 如果不是因为迫不得已 ...

  6. 关于Jenkins部署代码权限三种方案

    关于Jenkins部署代码权限三种方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改Jenkins进程用户为root [root@jenkins ~]# cat /etc ...

  7. 三种方案在Windows系统下安装ubuntu双系统

    一.虚拟机安装(不推荐) 使用工具:Vmware 如果不是因为迫不得已,比如Mac OS对硬件不兼容,Federa安装频繁出错,各种驱动不全等等,不推荐使用虚拟机安装. 个人感觉这是一种对操作系统的亵 ...

  8. Maven打jar包的三种方式

    Maven打jar包的三种方式 不包含依赖jar包 该方法打包的jar,不包含依赖的jar包,也没有指定入口类. <build> <plugins> <plugin> ...

  9. Spring-Boot-操作-Redis,三种方案全解析!

    在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了,关于 Redis,松哥之前有一个系列教程,尚不了解 Redis 的小伙伴可以参考这个教程: Redis 教 ...

随机推荐

  1. 第10课 面向对象的增强(default/delete、override/final)

    一.default和delete关键字 (一)编译器提供的“缺省函数” 1.类的成员函数:构造/析构函数.复制构造/复制赋值函数.移动构造/移动赋值函数. 2. 类的全局默认操作函数:operator ...

  2. drf面试题及总结

    drf面试题及总结 1.什么是前后端分离 2.什么是restful规范 3.模拟浏览器进行发送请求的工具 4.查找模板的顺序 5.什么是drf组件 6.drf组件提供的功能 7.drf继承过哪些视图类 ...

  3. cmdb知识总结

    cmdb面试 1.paramiko模块的作用与原理 2.cmdb是什么 3.为什么要开发CMDB? 4.你们公司有多少台服务器?物理机?虚拟机? 5.你的CMDB是如何实现的? 6.CMDB都用到了哪 ...

  4. 信安周报-第03周:DB系统表

    信安之路 第03周 前言 这周自主研究的任务如下: 任务附录的解释: 文件读写在通过数据库注入漏洞获取webshell的时候很有用 系统库和表存放了很多关键信息,在利用注入漏洞获取更多信息和权限的过程 ...

  5. 在linux上安装elasticsearch简称ES 简单介绍安装步骤

    1.简介 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 ...

  6. 使用IDEA创建maven父子工程项目

    http://www.pianshen.com/article/3070289153/ 第一步: 打开IDEA,点击create new project,如果没有弹出如下界面,就先将打开的项目关闭,然 ...

  7. EasyUI datagrid-export 将datagrid的数据导出至Excel-解决科学计数法

    通过EasyUI datagrid-export.js 将datagrid的数据导出至Excel的时候,如果有类似身份证一样很长的数字,需要在后台返回数据的时候在数字前增加一个 “ ”,将数字转为字符 ...

  8. linux部署安装SRS流媒体服务器教程

    这段时间一直在搞RTMP流媒体直播项目,期间踩过很多坑,刚开始是用的nginx-rtmp作为流媒体转发服务器,但是效果并不尽人意,推拉流不稳定,特别是拉流,速度特别慢,平均要十多秒才能拉到流,并且交互 ...

  9. RabbitMQ学习之Routing(4)

    上一节,是广播日志message到很多的receivers. 这节,我们讲订阅其中的一个子集.例如,我们想可以把危机的error message导到log file.而仍然可以打印所有的log mes ...

  10. 调用日志输出错误:TypeError: 'int' object is not callable等

    *)TypeError: 'int' object is not callable 错误信息: Traceback (most recent call last): File "Visual ...