广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何获取Maven项目的版本号
  • 527
分享到

如何获取Maven项目的版本号

2024-04-02 19:04:59 527人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录jar包的秘密 Maven资源插件过滤 Spring Boot提供 总结 目前大多数spring Boot项目都会打成Jar包,所以什么War包、Ear包的就先不摸索了。 Jar

目前大多数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项目的版本号的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何获取Maven项目的版本号

本文链接: https://www.lsjlt.com/news/126580.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何获取Maven项目的版本号
    目录Jar包的秘密 Maven资源插件过滤 Spring Boot提供 总结 目前大多数Spring Boot项目都会打成Jar包,所以什么War包、Ear包的就先不摸索了。 Jar...
    99+
    2022-11-12
  • 怎么获取Maven项目的版本号
    这篇文章将为大家详细讲解有关怎么获取Maven项目的版本号,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。目前大多数Spring Boot项目都会打成Jar包,所以什么War包、Ear包的就先不摸索了。Ja...
    99+
    2023-06-15
  • Maven项目如何修改JDK版本
    这篇文章主要讲解了“Maven项目如何修改JDK版本”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Maven项目如何修改JDK版本”吧!1.1 打开Eclipse开发工具 配置JD...
    99+
    2023-07-05
  • 如何获取WebLogic的版本号
    本篇内容主要讲解“如何获取WebLogic的版本号”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何获取WebLogic的版本号”吧! ...
    99+
    2022-10-18
  • python中获取python版本号的方
     最近在思考如何使用python做自动化测试的问题,没啥进展。感觉国内自动化测试ruby用的比较多,目前想做一件事就是如何用python来测试web程序,包括web的页面检查。在大型企业架构中单元测试是一个很重要的概念,这个概念在后端代码...
    99+
    2023-01-31
    版本号 python
  • Android 开发中如何获取应用的版本号
    Android 开发中如何获取应用的版本号 在Android开发中,获取应用的版本号是一项常见的需求。应用的版本号通常用于记录应用程序的更新历史和区分不同版本之间的功能差异。下面将介绍在Android...
    99+
    2023-10-21
    android Android
  • maven配置文件pom如何增加变量取版本号
    这篇文章主要介绍了maven配置文件pom如何增加变量取版本号,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。maven配置文件pom增加变量取版本号1.定义版本号<pr...
    99+
    2023-06-22
  • 【java】maven 指定项目编译与打包的JDK版本
    Maven 是一个流行的构建工具,用于管理 Java 项目的依赖项、构建和部署。在 Maven 中,可以指定项目的编译和打包所使用的 JDK 版本。本篇博客将介绍如何在 Maven 中指定项目的 JDK 版本,并讨论该选项对项目的影响。 指...
    99+
    2023-08-30
    java maven mysql
  • IDEA2022版本创建maven web项目的两种方式详解
    目录创建方式一、使用骨架的方式二、maven中添加 web方式额外知识:IDEA配置tomcat总结:创建maven web项目有两种方式,一种是使用骨架方式,一种是不使用骨架的方式...
    99+
    2023-02-18
    idea2022创建maven web项目 idea2022创建 web项目 idea2022创建maven
  • maven中配置项目的jdk版本无效怎么排查
    这篇文章主要介绍了maven中配置项目的jdk版本无效怎么排查的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇maven中配置项目的jdk版本无效怎么排查文章都会有所收获,下面我们一起来看看吧。maven配置项目...
    99+
    2023-07-05
  • Maven项目中如何引入本地的jar包
    Maven项目中如何引入本地的jar包 准备工作 1.自己提前准备本地的jar包 , 例如:jar包位置:D:/soft/ip-info-2.2.1.jar 解决办法 方法一 、 直接在pom文件中添加 com.jthinking....
    99+
    2023-08-20
    maven jar java
  • maven中配置项目的jdk版本无效的排查方式
    目录maven配置项目的jdk版本无效排查maven version 指定版本不生效出现问题原因解决总结maven配置项目的jdk版本无效排查 最近在配置项目的jdk的时候发现在po...
    99+
    2023-05-15
    maven配置jdk版本 jdk版本无效的排查 maven jdk版本
  • springboot之如何获取项目目录路径
    目录springboot获取项目目录路径springboot获取resources目录资源文件9种方式方式一方式二方式三方式四(重要)方式五(重要)方式六(重要)方式七方式八方式九总...
    99+
    2023-05-20
    springboot项目路径 springboot获取目录路径 springboot目录路径获取
  • 如何创建Maven的项目
    今天小编给大家分享一下如何创建Maven的项目的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.什么是Maven项目Mave...
    99+
    2023-06-26
  • vue项目中如何获取节点
    这篇文章给大家分享的是有关vue项目中如何获取节点的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue项目中如何获取节点?Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定...
    99+
    2022-10-19
  • java如何获取tomcat项目路径
    在Java中,可以使用ServletContext对象的getRealPath()方法来获取Tomcat项目的路径。可以通过以下代码...
    99+
    2023-09-27
    java tomcat
  • 适配Laravel项目的版本号规划是什么
    本文小编为大家详细介绍“适配Laravel项目的版本号规划是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“适配Laravel项目的版本号规划是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在发布一个开源...
    99+
    2023-07-05
  • Vue项目如何获取本地文件夹绝对路径
    目录一、前端代码1.弹框样式代码2.导入方法(不要忘记了导入方法和data定义)3.方法区代码4.api接口中的config.js代码二、后端代码controller层代码servi...
    99+
    2023-01-28
    Vue本地文件夹 Vue绝对路径 Vue路径
  • Android获取手机的版本号等信息的代码
    本文实例分享了Android获取手机系统版本等信息的方法,供大家参考,具体内容如下: 第一种代码: String phoneInfo = "Product: " + andr...
    99+
    2022-06-06
    版本 版本号 手机 Android
  • 如何在SpringBoot+Freemarker中获取项目根目录
    目录在Freemarker中获取项目根目录在Freemark模板引擎路径的几种设置方法在SpringMVC中我们想返回视图是怎么做的在SpringBoot中springboot不推荐...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作