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

Java17+GraalVM+SpringBoot3遇不可达代码错误,是否升级Java21?

GraalVM 执行错误:UnsupportedFeatureError 解决方案

错误信息

Exception in thread "main" com.oracle.svm.core.jdk.UnsupportedFeatureError: Code that was considered unreachable by closed-world analysis was reached.
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:92)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.snippets.SnippetRuntime.unsupportedFeature(SnippetRuntime.java:173)
        at java.base@17.0.9/java.io.BufferedReader.close(BufferedReader.java:522)
        at java.base@17.0.9/java.util.ServiceLoader$LazyClassPathLookupIterator.parse(ServiceLoader.java:1178)
        at java.base@17.0.9/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1213)
        at java.base@17.0.9/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1228)
        at java.base@17.0.9/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
        at java.base@17.0.9/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
        at java.base@17.0.9/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
        at org.slf4j.LoggerFactory.findServiceProviders(LoggerFactory.java:114)
        at org.slf4j.LoggerFactory.bind(LoggerFactory.java:178)
        at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:170)
        at org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:455)
        at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:441)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:390)
        at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:121)
        at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:95)
        at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67)
        at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59)
        at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:185)
        at com.quizroulette.LegacyServer.LegacyServerApplication.main(LegacyServerApplication.java:10)

升级到Java 21是否可行?

直接升级到Java 21是可行的,但需要满足两个关键条件:

  1. GraalVM版本兼容:必须使用支持Java 21的GraalVM版本(如GraalVM 22.3及以上),确保GraalVM与JDK版本匹配。
  2. 框架依赖适配:项目使用的Spring Boot等框架需要支持Java 21——Spring Boot 3.x完全适配Java 17+,若当前使用2.7.x版本,需确认其补丁版本对Java 21的支持情况,必要时同步升级框架。

为什么Java 21能修复这个问题

该错误源于GraalVM封闭世界分析误判BufferedReader.close()中的代码不可达,但运行时实际触发了这段逻辑。Java 21对ServiceLoader及IO相关代码做了优化调整,同时GraalVM针对Java 21的支持修复了这类分析误判问题,因此升级后该错误大概率会消失。

临时替代方案(若无法升级Java 21)

  • 升级Java 17对应的最新GraalVM补丁版本,Oracle后续补丁可能修复了该特定分析错误。
  • 添加GraalVM反射配置:在reflect-config.json中声明SLF4J的服务提供者类,让封闭世界分析识别到这些类的存在。
  • 切换SLF4J绑定方式:直接使用logback-classic等静态绑定实现,避免通过ServiceLoader动态查找日志提供者。

内容的提问来源于stack exchange,提问作者Smit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:45:33