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

Quarkus Maven插件未添加Manifest实现项及版本读取问题咨询

解决Quarkus JAX-RS服务中读取Maven构件版本的问题

你的问题我很熟悉——这其实是Quarkus构建机制和标准Maven jar插件差异导致的配置不兼容问题,我来给你梳理清楚解决方案:

为什么你的配置不生效?

你用的archive/manifest配置是标准maven-jar-plugin的写法,但quarkus-maven-plugin有自己独立的打包逻辑,它并不识别这种配置结构,所以会直接忽略这些设置,这就是为什么在普通Maven项目里能用,但Quarkus项目里不行。

推荐的解决方案(无需直接读取pom.xml)

结合你提到的已解决的Issue#5100,现在有两种更符合Quarkus生态的方法:

方法一:利用Quarkus原生配置系统(最简洁)

这是Quarkus官方推荐的方式,不需要操作Manifest,直接通过配置注入Maven属性:

  1. 在src/main/resources/application.properties中添加:
    quarkus.application.version=${project.version}
    quarkus.application.vendor=${project.organization.name}
    
    这里的${project.version}和${project.organization.name}会由Maven自动替换为你pom.xml中的对应值。
  2. 在你的JAX-RS资源类中通过@ConfigProperty注入这些值:
    import jakarta.inject.Inject;
    import jakarta.ws.rs.GET;
    import jakarta.ws.rs.Path;
    import org.eclipse.microprofile.config.inject.ConfigProperty;
    
    @Path("/app-info")
    public class AppInfoResource {
    
        @Inject
        @ConfigProperty(name = "quarkus.application.version")
        String appVersion;
    
        @Inject
        @ConfigProperty(name = "quarkus.application.vendor")
        String appVendor;
    
        @GET
        public String getAppInfo() {
            return String.format("版本:%s,厂商:%s", appVersion, appVendor);
        }
    }
    

方法二:配置Quarkus生成正确的Manifest条目

如果你坚持想用getClass().getPackage().getImplementationVersion()这种方式读取,在Issue#5100修复后的Quarkus版本中,你可以通过以下配置实现:

  1. 方式一:在application.properties中添加一行配置,自动添加Manifest条目:
    quarkus.package.add-implementation-entries=true
    
  2. 方式二:直接在quarkus-maven-plugin中配置:
    <plugin>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-maven-plugin</artifactId>
        <version>${quarkus.version}</version>
        <configuration>
            <!-- 替代你原来的archive/manifest配置 -->
            <addImplementationEntries>true</addImplementationEntries>
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>build</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

配置完成后,你原来的代码就能正常读取到Implementation-Version和Implementation-Vendor的值了。

旧版本Quarkus的临时替代方案

如果你暂时无法升级到包含Issue#5100修复的Quarkus版本,可以通过Maven资源过滤的方式实现:

  1. 在pom.xml中开启资源过滤:
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
    
  2. 创建src/main/resources/app-version.properties文件:
    app.version=${project.version}
    app.vendor=${project.organization.name}
    
  3. 在代码中读取这个属性文件:
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    public class VersionHelper {
        public static String getAppVersion() {
            Properties props = new Properties();
            try (InputStream is = VersionHelper.class.getResourceAsStream("/app-version.properties")) {
                props.load(is);
                return props.getProperty("app.version", "unknown");
            } catch (IOException e) {
                return "unknown";
            }
        }
    }
    

补充说明

你提到的Issue#5023正是跟踪这个Manifest条目缺失问题的,而Issue#5100的修复已经在后续的Quarkus版本中发布,只要你使用的版本包含这个修复,上面的方法一和方法二都能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:51