Quarkus CLI开发模式选用错误Java版本的原因及配置咨询
Quarkus CLI使用Java版本不匹配问题解答
问题背景
在Quarkus 3.1.1.Final应用中已在POM文件配置使用Java 17,日常使用Quarkus CLI执行quarkus dev或quarkus test命令,升级后命令报错,错误信息如下:
Exception in thread "main" java.lang.RuntimeException: java.lang.UnsupportedClassVersionError: org/apache/camel/quarkus/core/devmode/CamelHotReplacementSetup has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0 at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:137) at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62) Caused by: java.lang.UnsupportedClassVersionError: org/apache/camel/quarkus/core/devmode/CamelHotReplacementSetup has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0 at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:506) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:466) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:398) at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1210) at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1221) at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1265) at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1300) at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1385) at io.quarkus.deployment.dev.IsolatedTestModeMain.setupRuntimeCompilation(IsolatedTestModeMain.java:73) at io.quarkus.deployment.dev.IsolatedTestModeMain.accept(IsolatedTestModeMain.java:123) at io.quarkus.deployment.dev.IsolatedTestModeMain.accept(IsolatedTestModeMain.java:34) at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:138) at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:93) at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
已验证mvn clean verify、mvn compile quarkus:dev、mvn compile quarkus:test可成功构建,IntelliJ中用Java 17可运行所有测试,Docker容器(基于Java 17)中应用运行正常,仅Quarkus CLI使用Java 11导致报错。
一、Quarkus CLI选用Java 11而非Java 17的原因
- Quarkus CLI是独立二进制程序,优先使用系统
JAVA_HOME指向的JDK版本,若JAVA_HOME配置为Java 11,则CLI默认使用该版本。 - 系统
PATH环境变量中,Java 11的java可执行文件路径优先级高于Java 17,导致CLI调用Java 11。 - 部分安装方式(如包管理器)的Quarkus CLI会绑定自带的JRE/JDK,若绑定版本为Java 11,会忽略系统JDK配置。
二、如何配置Quarkus CLI使用与Maven相同的Java版本
- 临时生效:执行CLI命令前临时指定
JAVA_HOME:# Linux/macOS export JAVA_HOME=/path/to/your/java17 quarkus dev # Windows(PowerShell) $env:JAVA_HOME = "C:\path\to\your\java17" quarkus dev - 永久生效:修改系统环境变量,将
JAVA_HOME指向Java 17,并确保Java 17的bin目录在PATH最前端。 - 项目级配置:在项目根目录创建
.quarkus.env文件,添加以下内容,CLI在该项目目录执行时会自动读取:JAVA_HOME=/path/to/your/java17 - 检查CLI安装:若通过包管理器安装,升级CLI到最新版本,或重新安装时指定绑定Java 17版本。
三、Maven命令与Quarkus CLI的核心差异
- JDK版本选择逻辑:Maven会优先遵循POM中
<maven.compiler.source>/<maven.compiler.target>配置,同时校验本地JDK版本是否符合要求;Quarkus CLI直接依赖系统环境的JDK,不读取POM的Java版本配置。 - 执行流程:Maven命令运行在完整的构建生命周期中,会触发编译、依赖下载等前置步骤;Quarkus CLI直接调用Quarkus核心模块,跳过部分Maven生命周期步骤,启动速度更快。
- 依赖处理:Maven自动管理依赖下载与更新;Quarkus CLI依赖本地Maven仓库缓存,若依赖未提前下载,需先执行
mvn install或quarkus build。 - 功能覆盖:Maven可通过插件配置定制构建细节;Quarkus CLI提供快捷命令(如
quarkus create),部分参数与Maven插件对应,但也有独有的功能。
内容的提问来源于stack exchange,提问作者Rick Slinkman
相关产品推荐
相关产品推荐

