从Java EE迁移到Quarkus后,如何获取pom.xml定义的应用版本?
解决Quarkus中获取项目版本的问题
你遇到的问题其实很常见——Maven的project.version并不会自动成为Quarkus/MicroProfile Config的可用属性,所以直接用@ConfigProperty会找不到它。下面给你几个更优的实现方案,从简单过渡到原生Quarkus风格都有:
方案一:通过application.properties桥接Maven属性
这是最直接的过渡方案,和你原来的思路接近:
- 在
src/main/resources/application.properties中添加一行:app.version=${project.version} - 确保Maven会过滤这个文件,替换掉
${project.version}。如果你的pom.xml里还没配置资源过滤,需要添加:<build> <!-- 原有插件配置保留 --> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>application.properties</include> </includes> </resource> </resources> </build> - 然后在你的JAX-RS端点中就可以正常注入了:
@ConfigProperty(name = "app.version") String version; @GET public Response getVersion() { return Response.ok(Json.createObjectBuilder().add("version", version).build()).build(); }
方案二:使用Quarkus原生的Build Info扩展(推荐)
Quarkus提供了专门的扩展来获取构建元数据,不需要手动维护配置文件,更符合Quarkus的风格:
- 在pom.xml中添加依赖:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-build-info</artifactId> </dependency> - 直接注入
BuildInfo对象到你的端点中,它包含了项目版本、构建时间、groupId、artifactId等所有构建相关信息:import io.quarkus.build.BuildInfo; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Response; import jakarta.json.Json; @Path("/version") public class VersionResource { @Inject BuildInfo buildInfo; @GET public Response getVersion() { var json = Json.createObjectBuilder() .add("version", buildInfo.getVersion()) .add("artifact-id", buildInfo.getArtifactId()) .add("build-time", buildInfo.getBuildTimestamp()) .build(); return Response.ok(json).build(); } }
这个方案的好处是不需要任何额外的配置文件,Quarkus在构建时会自动收集这些信息,非常省心。
方案三:保留原有的properties文件方式(兼容Java EE)
如果你想完全保留原来的实现逻辑,也可以继续使用buildInfo.properties:
- 确保
src/main/resources/buildInfo.properties中的version=${project.version}会被Maven替换,同样需要配置资源过滤(和方案一的resources配置一样,把buildInfo.properties加入includes)。 - 原来的代码在Quarkus中可以直接运行,不需要修改——Quarkus的类加载机制完全支持
getClassLoader().getResourceAsStream()读取资源文件。
最后说一下你之前报错的原因:MicroProfile Config的配置源默认包括系统属性、环境变量、application.properties等,但Maven的project.version是构建时的变量,不属于这些默认源,所以必须通过上面的方式把它导入到配置系统中,或者用Build Info扩展直接获取。
内容的提问来源于stack exchange,提问作者alexander
相关产品推荐
相关产品推荐

