如何在classpath依赖的jar包中获取所属Maven项目pom.xml的版本号
从被依赖的Health Utility Jar中获取宿主项目Maven版本号的实现方案
下面是4种可落地的实现方案,可根据实际场景选择:
方案1:读取宿主项目自动生成的pom.properties文件
Maven在构建项目时默认会生成pom.properties文件,存放在项目Jar包的META-INF/maven/[宿主项目groupId]/[宿主项目artifactId]/路径下,文件内包含version、groupId、artifactId三个核心属性。
实现逻辑:- 在Utility Jar中通过当前线程的类加载器
Thread.currentThread().getContextClassLoader()扫描类路径下的META-INF目录,匹配宿主项目对应的pom.properties文件 - 读取文件中的
version属性值即可
注意:如果宿主项目手动配置了关闭maven属性文件生成,需要提前要求宿主项目恢复开启该生成逻辑。
- 在Utility Jar中通过当前线程的类加载器
方案2:基于SPI机制暴露版本获取接口,由宿主项目实现
在Utility Jar中定义一个版本提供接口,比如ProjectVersionProvider,内部包含getVersion()抽象方法。宿主项目引入依赖后,实现该接口并返回自身项目的版本号,同时按SPI规范注册实现类。
实现逻辑:- Utility Jar中定义接口:
public interface ProjectVersionProvider { String getVersion(); }- 宿主项目实现该接口,可直接硬编码版本,也可通过
@Value("${project.version}")注入版本值(Spring项目适用),然后在META-INF/services/路径下创建对应接口全限定名的文件,内容填写实现类的全限定名 - Utility Jar中通过
ServiceLoader加载所有ProjectVersionProvider的实现,调用getVersion()即可拿到宿主项目版本
优势:兼容性强,不受宿主项目构建配置影响,支持多版本、多模块场景的定制化返回。
方案3:Spring Boot场景下通过环境变量传递版本
如果宿主项目是Spring Boot项目,Maven构建时默认支持把project.version注入到Spring环境变量中。
实现逻辑:- Utility Jar编写Spring Boot自动配置类,直接注入
@Value("${project.version:unknown}")即可获取到宿主项目的版本号 - 要求宿主项目在pom.xml的build配置中开启资源过滤,确保
project.version能被正确替换到application配置文件中:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>- Utility Jar编写Spring Boot自动配置类,直接注入
方案4:读取宿主项目Jar包的MANIFEST.MF文件
Maven构建时可以配置将项目版本号写入Jar包的META-INF/MANIFEST.MF文件的自定义属性中。
实现逻辑:- 要求宿主项目在pom.xml中配置maven-jar-plugin,添加自定义Manifest属性:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifestEntries> <Project-Version>${project.version}</Project-Version> </manifestEntries> </archive> </configuration> </plugin>- Utility Jar中读取类路径下所有Jar包的MANIFEST.MF文件,匹配到宿主项目对应的Jar后读取
Project-Version属性值即可。
内容的提问来源于stack exchange,提问作者aditya singhal
相关产品推荐
相关产品推荐

