Quarkus原生应用构建失败求助:执行mvn package -Pnative报错
Quarkus原生应用构建失败问题解决
问题场景
执行mvn package -Pnative构建Quarkus原生应用时失败,核心错误为GraalVM原生镜像生成过程中大量Converter的provider()方法未找到,最终导致构建终止。
环境信息:
- 系统:Windows 11
- IDE:IntelliJ IDE
- Java版本:17
- GraalVM版本:graalvm-jdk-17.0.12+8.1
- Quarkus版本:3.28.2
错误日志
[ERROR] Failed to execute goal io.quarkus.platform:quarkus-maven-plugin:3.28.2:build (default) on project rest-book: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors [ERROR] [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: io.quarkus.deployment.pkg.steps.NativeImageBuildStep$ImageGenerationFailureException: Image generation failed [ERROR] at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.imageGenerationFailed(NativeImageBuildStep.java:498) [ERROR] at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:289) [ERROR] at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) [ERROR] at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:874) [ERROR] at io.quarkus.builder.BuildContext.run(BuildContext.java:255) [ERROR] at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18) [ERROR] at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2651) [ERROR] at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2630) [ERROR] at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1622) [ERROR] at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1589) [ERROR] at java.base/java.lang.Thread.run(Thread.java:842) [ERROR] at org.jboss.threads.JBossThread.run(JBossThread.java:501) [ERROR] Caused by: io.smallrye.common.process.AbnormalExitException: Process exited abnormally (pid 20504) with exit code 1 with error output: [ERROR] > Warning: Method io.quarkus.runtime.logging.LevelConverter.provider() not found. [ERROR] > Warning: Method io.quarkus.runtime.configuration.CharsetConverter.provider() not found. [ERROR] > Warning: Method io.quarkus.runtime.configuration.MemorySizeConverter.provider() not found. [ERROR] > Warning: Method io.quarkus.runtime.configuration.InetSocketAddressConverter.provider() not found. [ERROR] > Warning: Method io.quarkus.vertx.http.runtime.TrustedProxyCheckPartConverter.provider() not found. [ERROR] > … (skipped 199 line(s)) … [ERROR] > [ERROR] > [ERROR] > at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.constraints.UnsupportedFeatures.report(UnsupportedFeatures.java:129) [ERROR] > at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:793) [ERROR] > ... 6 more [ERROR] at io.smallrye.common.process.PipelineRunner.collectProblems(PipelineRunner.java:559) [ERROR] at io.smallrye.common.process.ProcessRunner.complete(ProcessRunner.java:165) [ERROR] at io.smallrye.common.process.ProcessRunner.run(ProcessRunner.java:95) [ERROR] at io.smallrye.common.process.ProcessBuilderImpl.run(ProcessBuilderImpl.java:199) [ERROR] at io.quarkus.deployment.pkg.steps.NativeImageBuildRunner.build(NativeImageBuildRunner.java:77) [ERROR] at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:283) [ERROR] ... 10 more [ERROR] -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the '-e' switch [ERROR] Re-run Maven using the '-X' switch to enable verbose output [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
当前pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.quarkus.starting</groupId> <artifactId>rest-book</artifactId> <version>1.0.0</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.parameters>true</maven.compiler.parameters> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id> <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id> <quarkus.platform.version>3.28.2</quarkus.platform.version> <compiler-plugin.version>3.14.0</compiler-plugin.version> <skipITs>true</skipITs> <surefire-plugin.version>3.5.4</surefire-plugin.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>${quarkus.platform.group-id}</groupId> <artifactId>${quarkus.platform.artifact-id}</artifactId> <version>${quarkus.platform.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-jsonb</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-arc</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>${quarkus.platform.group-id}</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.platform.version}</version> <extensions>true</extensions> <executions> <execution> <goals> <goal>build</goal> <goal>generate-code</goal> <goal>generate-code-tests</goal> <goal>native-image-agent</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${compiler-plugin.version}</version> <configuration> <parameters>true</parameters> </configuration> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>${surefire-plugin.version}</version> <configuration> <systemPropertyVariables> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>${surefire-plugin.version}</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> <configuration> <systemPropertyVariables> <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>native</id> <activation> <property> <name>native</name> </property> </activation> <properties> <quarkus.native.enabled>true</quarkus.native.enabled> <quarkus.package.jar.enabled>false</quarkus.package.jar.enabled> <skipITs>false</skipITs> </properties> </profile> </profiles> </project>
解决方案
1. 统一Java编译版本
当前pom.xml配置的编译版本为Java 11,但实际运行环境是Java 17,版本不一致会导致字节码兼容性问题。修改pom.xml中的编译参数:
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target>
2. 移除不必要的插件目标
native-image-agent目标用于生成原生镜像的反射配置,不应包含在build阶段的执行目标中。修改quarkus-maven-plugin的executions:
<executions> <execution> <goals> <goal>build</goal> <goal>generate-code</goal> <goal>generate-code-tests</goal> </goals> </execution> </executions>
3. 升级GraalVM版本
Quarkus 3.28.x推荐使用GraalVM 24.0.x版本(与Java 17兼容),旧版本GraalVM可能存在与新版本Quarkus的兼容性问题。下载对应版本的GraalVM并配置环境变量,确保GRAALVM_HOME指向正确路径。
4. 生成正确的原生镜像配置(可选)
如果上述步骤仍未解决问题,使用native image agent自动生成反射、资源等配置:
- 启动Quarkus开发模式:
mvn quarkus:dev - 访问应用所有接口,触发所有需要反射的代码路径
- 执行命令生成配置:
mvn quarkus:native-image-agent - 生成的配置文件会放在
target/native-image-agent-output目录,将其复制到src/main/resources/META-INF/native-image下
5. 清理缓存后重新构建
执行以下命令清理本地构建缓存并重新构建:
mvn clean package -Pnative
内容的提问来源于stack exchange,提问作者Ferid Raouf
相关产品推荐
相关产品推荐

