You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Java EE迁移到Quarkus后,如何获取pom.xml定义的应用版本?

解决Quarkus中获取项目版本的问题

你遇到的问题其实很常见——Maven的project.version并不会自动成为Quarkus/MicroProfile Config的可用属性,所以直接用@ConfigProperty会找不到它。下面给你几个更优的实现方案,从简单过渡到原生Quarkus风格都有:

方案一:通过application.properties桥接Maven属性

这是最直接的过渡方案,和你原来的思路接近:

  1. 在src/main/resources/application.properties中添加一行:
    app.version=${project.version}
    
  2. 确保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>
    
  3. 然后在你的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的风格:

  1. 在pom.xml中添加依赖:
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-build-info</artifactId>
    </dependency>
    
  2. 直接注入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:

  1. 确保src/main/resources/buildInfo.properties中的version=${project.version}会被Maven替换,同样需要配置资源过滤(和方案一的resources配置一样,把buildInfo.properties加入includes)。
  2. 原来的代码在Quarkus中可以直接运行,不需要修改——Quarkus的类加载机制完全支持getClassLoader().getResourceAsStream()读取资源文件。

最后说一下你之前报错的原因:MicroProfile Config的配置源默认包括系统属性、环境变量、application.properties等,但Maven的project.version是构建时的变量,不属于这些默认源,所以必须通过上面的方式把它导入到配置系统中,或者用Build Info扩展直接获取。

内容的提问来源于stack exchange,提问作者alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:11:50