如何获取Maven项目的版本号

网友投稿 429 2022-10-23


如何获取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中的属性注入到指定的资源文件中,具体操作为:

...

src/main/resources

true

main.properties

...

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

${basedir}/src/main/resources

true

**/application*.yml

**/application*.yaml

**/application*.properties

&lJBpbSRyt;/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

我们只需要配置插件为:

org.springframework.boot

spring-boot-maven-plugin

build-info

就能使得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项目的版本号的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Windows提权之权限维持
下一篇:http协议请求方法都有哪些?网络安全学习提升
相关文章

 发表评论

暂时没有评论,来抢沙发吧~