如何获取Maven项目的版本号

目前大多数Spring Boot项目都会打成Jar包,所以什么War包、Ear包的就先不摸索了。

Jar包的秘密

我们先解压一个Spring Boot应用Jar包看看里面能不能找到一些蛛丝马迹。在META-INF文件夹中找到了两个相关的东西,一个是MANIFEST.MF:

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: spring-boot-version
Implementation-Version: 1.0.23
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: cn.felord.SpringBootVersionApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.4.5
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher

里面包含了我定义的版本号1.0.23,Implementation-Version这个值好像通过代码能够获得:

String version = this.getClass().getPackage().getImplementationVersion()

但是用IDE启动发现version=null,不过用java -jar运行时version = 1.0.23。可能与IDE运行并不是通过jar的方式有关。

另一个是pom.properties,Maven项目编译会生成一个Properties配置文件:

artifactId=spring-boot-version
groupId=cn.felord
version=1.0.23

这岂不是读取Properties文件就可以了?

  String path = "META-INF/maven/cn.felord/spring-boot-version/pom.properties";
  ClassPathResource resource = new ClassPathResource(path);

  InputStream inputStream = resource.getInputStream();
  try (InputStreamReader reader = new InputStreamReader(inputStream)) {
      try (BufferedReader bufferedReader = new BufferedReader(reader)) {
          bufferedReader.lines()
                                .forEach(System.out::println);
         }
     } catch (Exception ignored) {

  }

这岂不是读取Properties文件就可以了?

  String path = "META-INF/maven/cn.felord/spring-boot-version/pom.properties";
  ClassPathResource resource = new ClassPathResource(path);

  InputStream inputStream = resource.getInputStream();
  try (InputStreamReader reader = new InputStreamReader(inputStream)) {
      try (BufferedReader bufferedReader = new BufferedReader(reader)) {
          bufferedReader.lines()
                                .forEach(System.out::println);
         }
     } catch (Exception ignored) {

  }

依然只能从jar读取,而且比较麻烦。这两种方式都要依赖jar包,有木有不单纯依赖jar包的呢?

Maven资源插件过滤

Maven在构建项目时可以通过资源插件将构建属性即pom.xml中的属性注入到指定的资源文件中,具体操作为:

<build>
  ...
  <resources>
    <!-- include main.properties -->
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
      <includes>
        <include>main.properties</include>
      </includes>
    </resource>
  </resources>
  ...
</build>

恰好spring-boot-starter-parent中已经设置了这种方式。

      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
          <include>**/application*.yml</include>
          <include>**/application*.yaml</include>
          <include>**/application*.properties</include>
        </includes>
      </resource>

如果你是application.properties,你可以通过下面的方式来接收版本号:

application.version = ${project.version}

如果是application.yaml,你可以通过下面的方式来接收版本号:

application:
  version: '@project.version@'

然后如何取值就不用多说了吧。这种方式不依赖jar包,使用起来也很简单。

Spring Boot提供

Spring Boot其实已经内置了获取项目构建信息的自动配置ProjectInfoAutoConfiguration,它包含一个条件BeanBuildProperties:

    @ConditionalOnResource(
        resources = {"${spring.info.build.location:classpath:META-INF/build-info.properties}"}
    )
    @ConditionalOnMissingBean
    @Bean
    public BuildProperties buildProperties() throws Exception {
        return new BuildProperties(this.loadFrom(this.properties
                                                 .getBuild()
                                                 .getLocation(), "build",                                                     this.properties
                                                 .getBuild().getEncoding()));
    }

这个BuildProperties提供了不少构建信息:

public class BuildProperties extends InfoProperties {
    public BuildProperties(Properties entries) {
        super(processEntries(entries));
    }

    public String getGroup() {
        return this.get("group");
    }

    public String getArtifact() {
        return this.get("artifact");
    }

    public String getName() {
        return this.get("name");
    }

    public String getVersion() {
        return this.get("version");
    }

    public Instant getTime() {
        return this.getInstant("time");
    }
   }

其中的条件build-info.properties可以通过Spring Boot插件spring-boot-maven-plugin执行下面的命令生成:

mvn spring-boot:build-info

我们只需要配置插件为:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>
                    build-info
                </goal>
            </goals>
        </execution>
    </executions>
</plugin>

就能使得BuildProperties生效,我们可以轻松取得相关的信息:

{
  "version" : "1.0.23",
  "group" : "cn.felord",
  "artifact" : "spring-boot-version",
  "name" : "spring-boot-version",
  "time" : {
    "epochSecond" : 1620664643,
    "nano" : 591000000
  }
}

总结

今天介绍了几种从通过API获取项目构建版本信息的方法,有什么用呢?主要用于项目监控,发版审计,DevOps等领域,包括Spring Boot的自定义banner。如果你的项目涉及到CI/CD,很可能要涉及到这一方面。 如果你知道更好用的获取方法欢迎留言讨论,我来抛砖引玉。

以上就是如何获取Maven项目的版本号的详细内容,更多关于获取Maven项目的版本号的资料请关注我们其它相关文章!

(0)

相关推荐

  • IDEA-Maven项目的jdk版本设置方法

    在 Intellij Idea 中,我们需要设置 Settings 中的 Java Compiler 和 Project Structure 中的 Language Level 中的 jdk 版本为自己目前使用的版本,否则会经常提示我们 jdk 版本不正确导致的语法错误. 比如配置为 jdk1.8 : 但是在 Maven 项目中,Java Compiler 和 Language level 中的设置会自动变回到 pom.xml 文件中设置的 jdk 版本或者默认的 jdk1.5 版本.所以我们需

  • 一行命令同时修改maven项目中多个module的版本号的方法

    Maven,是一个Java开发比较常用的项目管理工具,可以对 Java 项目进行构建.依赖管理. 对于很多Java程序员来说,分层架构都是不陌生的,至少MVC三层架构都是不陌生的,甚至有人说:"Any problem in computer science can be solved by anther layer of indirection." 想要在代码中进行分层,比较好的做法就是创建多module的项目 maven-parent (Maven Project) |- maven

  • Java使用Maven BOM统一管理版本号的实现

    一个中大型的 Java 项目往往包含若干 JAR 包,这些 JAR 包有着不同的版本号.如果这些 JAR 包单独发布,然后直接通过版本号引用相应的 JAR 包,不同版本的兼容性维护将变得十分麻烦.为了解决这个问题,可以让一个特殊的模块引用这些 JAR 包,将版本号定义在这个模块中,模块中的 JAR 都是兼容的,对外发布时只发布这个特殊模块.这个特殊模块就是 BOM(Bill Of Materials). 著名的 Spring Boot 就使用了这种方式来管理版本号,这个模块就是 spring-b

  • Java修改maven的默认jdk版本为1.7的方法

    问题: 1.创建maven项目的时候,jdk版本是1.5版本,而自己安装的是1.7或者1.8版本. 2.每次右键项目名-maven->update project 时候,项目jdk版本变了,变回1.5版本或者其他版本 解决办法: 解决办法一:在项目中的pom.xml指定jdk版本,如下: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <ar

  • maven如何动态统一修改版本号的方法步骤

    前言 最近业务开发部门因为开发环境和测试环境共用一个maven私仓,导致他们开发环境的API包和测试环境的API包发生了覆盖现象.于是他们向我们部门提出一个需求,希望我们能帮他们实现或者提供这么一个方案,就是项目自动化构建时,项目的版本号能跟着环境变更.比如是开发环境,则项目的API包版本就形如1.0-dev,如果是测试环境,则项目的API版本就形如1.0-test 示例演示 项目层级如下 方案一:mvn -Denv.project.version=1.0-env 注:env.project.v

  • 微服务中使用Maven BOM来管理你的版本依赖详解

    BOM简介 BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号.BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性. 为什么要使用BOM 使用BOM除了可以方便使用者在声明依赖的客户端时不需要指定版本号外,最主要的原因是可以解决依赖冲突,如考虑以下的依赖场景: 项目A依赖项目B 2.1和项目C 1.2版本: 项目B 2.1依赖项目

  • maven继承父工程统一版本号的实现

    一.建立一个maven工程 pom类型 统一管理依赖以及版本号 子工程不会使用所有的定义的依赖 子工程使用依赖时无需指定版本号 其pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4

  • 详解SpringBoot获得Maven-pom中版本号和编译时间戳

    这篇文章首先介绍了在SpringBoot中如何获得项目的编译时间和版本号,并向外提供接口,然后介绍了介绍了新版maven获得时间戳时区错误的解决方案,最后介绍了把时间戳加到包名的两种方法. SpringBoot项目获得编译时间戳和版本号,然后提供接口大概分为以下步骤: 在pom文件中获取maven的编译时间戳 配置pom,用maven中的属性渲染资源文件application.yml 提供接口 Maven中获得编译时间 在 pom文件properties 中添加两个属性 <properties>

  • idea2019版与maven3.6.2版本不兼容的解决方法

    昨天遇到了点问题解决浪费了一些时间(导致更新内容较少)回顾下问题 项目出现Unable to import maven project: See logs for details 翻了好多博客 莫名的忧伤 waht 本着沉重的心情早上起来再试一次 从idea本身去找问题 当然了写博客的同时证明我解决了此处省略(百度数次) 上流程 打开idea找到日志目录 程序是8.34打开的 定位了一段报错日志 java.lang.RuntimeException: com.google.inject.Crea

  • 如何获取Maven项目的版本号

    目前大多数Spring Boot项目都会打成Jar包,所以什么War包.Ear包的就先不摸索了. Jar包的秘密 我们先解压一个Spring Boot应用Jar包看看里面能不能找到一些蛛丝马迹.在META-INF文件夹中找到了两个相关的东西,一个是MANIFEST.MF: Manifest-Version: 1.0 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Implementation-Title: spring-boot-versi

  • JAVA maven项目使用钉钉SDK获取token、用户

    本文介绍了JAVA maven项目使用钉钉SDK获取token.用户,分享给大家,具体如下: 将SDK放一个文件里,记住文件地址.D:\eclipse-workspace\项目名\模块名\lib win+r cmd 敲下面的命令: [进入相应盘]   D: [进入文件地址]   cd D:\eclipse-workspace\项目名\模块名 [运行命令]  mvn install:install-file -DgroupId=com.dingtalk.api -DartifactId=top-a

  • idea将maven项目改成Spring boot项目的方法步骤

    1.添加parent父级依赖 在pom.xml文件中,要首先添加parent父级依赖 <!-- 这个parent是springboot的父级依赖, 它提供相关的starter的maven管理以及版本号管理,还有相关maven插件的公共配置 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artif

  • IntelliJ IDEA 创建Maven项目速度慢的2种解决方法

    IntelliJ IDEA 创建maven项目速度很慢,甚至卡住不动了. 原因 IDEA根据maven archetype的本质,其实是执行mvn archetype:generate命令,该命令执行时,需要指定一个archetype-catalog.xml文件. 该命令的参数-DarchetypeCatalog,可选值为:remote,internal ,local等,用来指定archetype-catalog.xml文件从哪里获取. remote--指向Maven中央仓库的Catalog i

  • idea新建maven项目时速度缓慢的解决方法

    原因 IDEA根据maven archetype的本质,其实是执行mvn archetype:generate命令,该命令执行时,需要指定一个archetype-catalog.xml文件. 该命令的参数-DarchetypeCatalog,可选值为:remote,internal  ,local等,用来指定archetype-catalog.xml文件从哪里获取. 默认为remote,即从 http://repo1.maven.org/maven2/archetype-catalog.xml路

  • Maven项目改为spring boot项目的方法图解

    目录树 •新建Maven项目及步骤 •修改方法 •启动测试 新建Maven项目及步骤 我这里是从创建开始讲,使用的工具是Idea2017版本.如果是已经创建了Maven,想改为spring boot项目的请直接跳到[修改方法] 1.点击右上角的File,出来的列表选择New Object: 2.选择Maven,勾选Create from archetype,选择quickstart 3.输入GroupId与ArtifactId,Version版本号自己看着怎么顺眼怎么改:其中GroupId为包名

  • 浅谈Maven 项目中依赖的搜索顺序

    网上有很多关于maven项目中mirror.profile.repository的搜索顺序的文章,说法不一.官方文档并没有找到相关的说明,鉴于此,我抽时间做了一个验证. 依赖仓库的配置方式 maven项目使用的仓库一共有如下几种方式: 中央仓库,这是默认的仓库 镜像仓库,通过 sttings.xml 中的 settings.mirrors.mirror 配置 全局profile仓库,通过 settings.xml 中的 settings.repositories.repository 配置 项目

  • idea创建maven项目速度慢的三种解决方案

    困扰 Intellij idea是一款非常强大的编辑器,可以很方便地帮我们创建maven项目,有用过的同学应该都深有体会,但我们经常会遇到一个困扰,那就是用idea创建maven项目时,速度很慢,往往需要好几分钟的时间,有时甚至会卡住,主要原因是创建maven项目时默认是下载求网络上的一个文件archetype-catalog.xml,该文件的大小有5-6M,下载的速度很慢,导致创建过程也变得很慢. 解决办法 解决办法有三种,并且都需要对maven的VM Options参数做配置. 方法一 在m

  • 基于Spring的Maven项目实现发送邮件功能的示例

    问题分析 现在我们有这样一个需求,就是当我们系统出现问题或bug的时候,让系统通过邮件发送日志信息给相关人员,那么此时,我们就需要实现一个让系统发送邮件的功能 解决步骤 1.pom jar包导入 <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.1</version> </dependency&g

  • IDEA中创建maven项目引入相关依赖无法下载jar问题及解决方案

    先如今idea中的spring项目,springBoot的项目的开发一般都是基于maven创建的项目.这大大简化我我们对于各种依赖包的管理,同时又使得各种依赖包方便管理.但是当maven中的依赖下载出现问题的时候也是很头痛. 问题场景 在公司的项目中用到了fastjson依赖,而依赖的版本是动态获取的,如图 但是在某天启动项目的时候报错,一查看原来是maven中fastjson依赖的原因, 这时大部分的人的操作应该和我一样: 操作1 点击maven的更新按钮,让maven自动下载对应的jar包到

随机推荐