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属性:
- 在
src/main/resources/application.properties中添加:
这里的quarkus.application.version=${project.version} quarkus.application.vendor=${project.organization.name}${project.version}和${project.organization.name}会由Maven自动替换为你pom.xml中的对应值。 - 在你的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版本中,你可以通过以下配置实现:
- 方式一:在
application.properties中添加一行配置,自动添加Manifest条目:quarkus.package.add-implementation-entries=true - 方式二:直接在
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资源过滤的方式实现:
- 在pom.xml中开启资源过滤:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> - 创建
src/main/resources/app-version.properties文件:app.version=${project.version} app.vendor=${project.organization.name} - 在代码中读取这个属性文件:
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
相关产品推荐
相关产品推荐

