java项目动态读取pom.xml设置的项目版本号(project.version)
1.情景展示
pom.xml设置的也有项目版本号
java类里面也需要设置项目的版本号
每次修改项目的版本号,都要改两遍,这就很麻烦了。
如果是springboot项目,很简单,我们只需要在配置文件中设置一个版本属性,它的值指定为:${project.version};
然后,在java类中获取配置文件中的版本属性即可。
但,我这一个简单的java maven项目,该如何动态获取到项目版本号呢?
2.具体分析
创建一个版本文件,并利用Maven构建工具实现内容的替换;
然后,封装一个工具类读取版本文件,并提供给外界使用。
3.解决方案
为项目创建resources目录。
创建一个版本文件,如:build.version,并将其放到resources目录下方。
文件内容
version=${project.version}
打开pom.xml
在build标签里面增加资源过滤配置
<resources>
<resource>
<directory>src/main/resources</directory> <!-- 资源文件所在目录 -->
<filtering>true</filtering> <!-- 开启过滤 -->
</resource>
</resources>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven.resources.plugin.version}</version> <!-- 使用最新版或适合你项目的版本 -->
<configuration>
<encoding>UTF-8</encoding> <!-- 设置资源文件编码 -->
</configuration>
</plugin>
说明:
我的build.version文件位于src/main/resources目录下。如果文件位于其他位置,请相应调整<directory>标签的内容。
这样一来,Maven在构建过程中会自动替换build.version文件中的${project.version}为pom.xml中定义的版本号。
创建java工具类读取build.version文件中的内容
import lombok.Getter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 项目版本设置工具类
* @author Marydon
* @version 1.0
* @description
* @date 2024-06-26
* @email marydon20170307@163.com
*/
public class VersionUtils {
/**
* -- FIELD --
* 版本文件名称
*/
private static final String VERSION_PROPERTIES = "build.version";
/**
* -- GETTER --
* 获取应用版本号
* @return java.lang.String 应用版本字符串
*/
@Getter
private static String version;
static {
try (InputStream resourceStream = VersionUtils.class.getClassLoader().getResourceAsStream(VERSION_PROPERTIES)) {
if (resourceStream == null) {
throw new RuntimeException("build.version file is not found in the classpath.");
}
Properties properties = new Properties();
properties.load(resourceStream);
version = properties.getProperty("version", "UNKNOWN");
} catch (IOException e) {
throw new RuntimeException("Failed to read version from build.version", e);
}
}
}
调用
这样,Java类中就能获取到pom.xml定义的project.version的值了。
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/18268660