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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:07:53