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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:41:57