使用Bazel运行Quarkus CLI应用时遭遇java.lang.RuntimeException求助
解决Bazel运行Quarkus CLI应用时的"Failed to locate project dir"异常
我们在单体仓库(monorepo)中用Bazel配置了MAVEN_REPOS,基于Quarkus 2.9.2.Final开发CLI应用,但执行bazel run //:MyApp时触发运行时异常。相关代码及报错信息如下:
BUILD.bazel
load("@rules_java//java:defs.bzl", "java_binary", "java_library") load("//build/bazel/rule_app_launcher:task_master.bzl", "tm_task") java_binary( name = "MyApp", srcs = ["Main.java"], main_class = "<package to the Main class>.Main", resources = ["<references to the application properties>"], visibility = ["//visibility:public"], deps = [ "@maven//:io_quarkus_quarkus_arc", "@maven//:io_quarkus_quarkus_core", ], )
Main.java
import io.quarkus.runtime.Quarkus; import io.quarkus.runtime.QuarkusApplication; import io.quarkus.runtime.annotations.QuarkusMain; @QuarkusMain public class Main { public static void main(String... args) { Quarkus.run(HelloWorldMain.class, args); } public class HelloWorldMain implements QuarkusApplication { @Override public int run(String... args) throws Exception { System.out.println("Hello " + args[0]); return 0; } } }
执行报错信息
Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at io.quarkus.launcher.QuarkusLauncher.launch(QuarkusLauncher.java:58) at io.quarkus.runtime.Quarkus.launchFromIDE(Quarkus.java:97) at io.quarkus.runtime.Quarkus.run(Quarkus.java:84) at io.quarkus.runtime.Quarkus.run(Quarkus.java:41) at <package to the Main class>.Main.main(Main.java:12) Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at io.quarkus.launcher.QuarkusLauncher.launch(QuarkusLauncher.java:56) ... 4 more Caused by: java.lang.IllegalStateException: Failed to locate project dir for /home/User123/.cache/bazel/_bazel_User123/b0cc32ca6725cc3e1476fd4087bd3d1d/execroot/app/bazel-out/k8-fastbuild/bin/<component path>/MyApp.jar at io.quarkus.bootstrap.IDELauncherImpl.launch(IDELauncherImpl.java:38) ... 9 more
解决线索
- Quarkus默认的IDE启动模式需要识别项目根目录,但Bazel运行时会将Jar包生成在缓存目录中,导致Quarkus无法定位项目目录。可在
java_binary中添加JVM参数指定项目根:java_binary( # 其他配置不变 jvm_flags = ["-Dquarkus.project.dir=$(pwd)"] ) - 替换Quarkus启动方式:
Quarkus.run()默认触发IDE模式启动,改用Quarkus.runInProcess()直接在当前进程运行,跳过依赖项目目录的IDE启动逻辑:public static void main(String... args) { Quarkus.runInProcess(HelloWorldMain.class, args); } - 检查资源文件打包:确保
resources字段正确引用了application.properties等配置文件,Bazel需要将这些文件正确打包进Jar,避免Quarkus因读取不到配置触发连锁异常。 - 验证依赖完整性:确认MAVEN_REPOS中已引入
quarkus-bootstrap-core等Quarkus启动必需的依赖,避免因缺失组件导致启动失败。
内容的提问来源于stack exchange,提问作者Debopam Mitra
相关产品推荐
相关产品推荐

