使用Maven打包Quarkus原生可执行文件时遇NoSuchFileException错误求助
问题分析
执行./mvnw package -Pnative "-Dquarkus.native.container-build=true"时,Quarkus启动Docker容器运行GraalVM构建原生镜像,但容器内找不到helloworld-1.0.0-SNAPSHOT-runner.jar——该文件实际位于target/helloworld-1.0.0-SNAPSHOT-native-image-source-jar/目录下,而构建脚本错误地在项目根目录(容器内/project)查找。
解决方案
方案1:修改Quarkus配置,指定正确的Jar路径
在项目的pom.xml中,给quarkus-maven-plugin添加原生镜像构建参数,明确指定runner.jar的位置:
<build> <plugins> <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.version}</version> <extensions>true</extensions> <executions> <execution> <goals> <goal>build</goal> <goal>generate-code</goal> <goal>generate-code-tests</goal> </goals> </execution> </executions> <configuration> <nativeImageArgs> <nativeImageArg>-jar</nativeImageArg> <nativeImageArg>target/${project.build.finalName}-native-image-source-jar/${project.build.finalName}-runner.jar</nativeImageArg> </nativeImageArgs> </configuration> </plugin> </plugins> </build>
使用${project.build.finalName}变量可避免硬编码项目版本,适配不同项目。
方案2:禁用Native Image Source Jar生成
在pom.xml的<properties>块中添加配置,让runner.jar直接生成在target目录下:
<properties> <quarkus.native.native-image-source-jar>false</quarkus.native.native-image-source-jar> </properties>
此配置会关闭单独生成native构建专用Jar的逻辑,将runner.jar直接输出到target根目录,容器构建时即可正常找到文件。
方案3:分步执行构建命令
先执行普通打包生成runner.jar,再执行原生镜像构建:
# 第一步:生成runner.jar ./mvnw package # 第二步:执行原生镜像构建 ./mvnw quarkus:native-image -Dquarkus.native.container-build=true
分步执行可确保runner.jar生成完成后,再启动容器进行原生构建,避免依赖顺序问题。
额外注意事项
- 确保执行命令时处于项目根目录(
helloworld目录),避免路径映射错误。 - 检查Quarkus版本,建议升级到最新稳定版,避免已知的构建路径bug。
- 你编写的
Dockerfile是用于将生成的原生可执行文件打包为Docker镜像的,需在原生构建完成(生成target/*-runner可执行文件)后,再执行docker build -t helloworld .进行镜像构建。
内容的提问来源于stack exchange,提问作者wfhdev98
相关产品推荐
相关产品推荐

