Maven构建Quarkus项目未生成-runner.jar问题求助
问题场景
通过原型生成Quarkus项目后,执行命令./mvnw -Dskiptests clean package构建,预期生成普通Jar和可执行的runner Jar,但实际仅得到普通Jar。已配置JAVA_HOME和GRAALVM_HOME指向GraalVM并安装Native Image,操作系统为Ubuntu。构建日志如下:
[INFO] Scanning for projects... [INFO] [INFO] ----------------< es.olivar.jaen:atomic-fruit-service >----------------- [INFO] Building atomic-fruit-service 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ atomic-fruit-service --- [INFO] Deleting /home/sobremesa/Documents/Develop/java/quarkus/poc/atomic-fruit-service/target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ atomic-fruit-service --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 2 resources [INFO] [INFO] --- quarkus-maven-plugin:2.11.3.Final:generate-code (default) @ atomic-fruit-service --- [INFO] [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ atomic-fruit-service --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /home/sobremesa/Documents/Develop/java/quarkus/poc/atomic-fruit-service/target/classes [INFO] [INFO] --- quarkus-maven-plugin:2.11.3.Final:generate-code-tests (default) @ atomic-fruit-service --- [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ atomic-fruit-service --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /home/sobremesa/Documents/Develop/java/quarkus/poc/atomic-fruit-service/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ atomic-fruit-service --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 2 source files to /home/sobremesa/Documents/Develop/java/quarkus/poc/atomic-fruit-service/target/test-classes [INFO] [INFO] --- maven-surefire-plugin:3.0.0-M7:test (default-test) @ atomic-fruit-service --- [INFO] Tests are skipped. [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ atomic-fruit-service --- [INFO] Building jar: /home/sobremesa/Documents/Develop/java/quarkus/poc/atomic-fruit-service/target/atomic-fruit-service-1.0-SNAPSHOT.jar [INFO] [INFO] --- quarkus-maven-plugin:2.11.3.Final:build (default) @ atomic-fruit-service --- [INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 1475ms [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 6.615 s [INFO] Finished at: 2022-08-29T23:38:29+02:00
排查步骤
1. 检查runner Jar是否在子目录中
从Quarkus 2.x版本开始,默认打包结构会将runner Jar放在target/quarkus-app目录下,而非直接在target根目录。进入该目录查看是否存在quarkus-runner.jar,这是可执行的fat jar。
2. 验证Quarkus打包配置
打开项目的pom.xml,检查是否存在以下配置:
<properties> <quarkus.package.uber-jar>false</quarkus.package.uber-jar> </properties>
如果quarkus.package.uber-jar被设为false,Quarkus不会生成可执行的runner Jar,仅生成普通Jar。将其改为true(默认值)后重新构建即可。
3. 确认插件绑定与版本
日志中已执行quarkus-maven-plugin:2.11.3.Final:build但未生成runner Jar,可能是插件绑定异常。尝试直接指定Quarkus打包目标:
./mvnw -DskipTests clean package quarkus:package
同时检查pom.xml中quarkus插件的配置,确保其绑定到package生命周期阶段:
<build> <plugins> <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.platform.version}</version> <executions> <execution> <goals> <goal>build</goal> <goal>generate-code</goal> <goal>generate-code-tests</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
4. 区分Fat Jar与原生镜像
你配置的GraalVM和Native Image是用来生成原生可执行文件(非runner Jar)的,需要执行./mvnw -DskipTests clean package -Pnative才会触发原生镜像构建。runner Jar是基于JVM的可执行Jar,不需要GraalVM即可生成,因此GraalVM的配置不影响runner Jar的生成。
内容的提问来源于stack exchange,提问作者Ignacio Yuste Lopez

