Spring Boot GraalVM原生镜像报错:JRT文件系统已禁用
问题描述
正在将Spring Boot 2.x项目迁移至Spring Boot 3.1.3,并使用GraalVM的native profile编译。已启用Spring AOT、生成可达性元数据,成功构建原生镜像。
环境信息:
- Windows 10 22H2 x64
- OpenJDK 17.0.8
- GraalVM CE 22.3.3
- MSVC 14.16.27023
运行原生可执行文件启动速度正常,但调用HTTP端点时抛出错误,核心异常栈如下:
Caused by: com.oracle.svm.core.jdk.UnsupportedFeatureError: JRT file system is disabled
解决方案
该错误源于GraalVM原生镜像默认禁用JRT文件系统,而WebJars的扫描逻辑(依赖ClassGraph)在运行时尝试访问JRT文件系统导致冲突,可通过以下方式解决:
方法1:启用JRT文件系统支持
在构建原生镜像时添加参数,允许JRT文件系统访问:
--enable-all-security-services --initialize-at-build-time=jdk.internal.module.SystemModuleFinders
Maven配置示例
在pom.xml的native插件中加入构建参数:
<plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <configuration> <buildArgs> <buildArg>--enable-all-security-services</buildArg> <buildArg>--initialize-at-build-time=jdk.internal.module.SystemModuleFinders</buildArg> </buildArgs> </configuration> </plugin>
Gradle配置示例
在build.gradle中配置原生镜像构建参数:
graalvmNative { binaries { main { buildArgs.add("--enable-all-security-services") buildArgs.add("--initialize-at-build-time=jdk.internal.module.SystemModuleFinders") } } }
方法2:禁用WebJars自动扫描(项目未使用WebJars时)
如果项目实际不依赖WebJars,可直接禁用其资源解析器,避免触发扫描逻辑:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/") .resourceChain(false); } }
方法3:升级ClassGraph版本
WebJars依赖的旧版ClassGraph对GraalVM原生镜像支持不足,可升级ClassGraph至v4.8.160+版本,新版本优化了原生镜像环境下的JRT文件系统处理逻辑。
内容的提问来源于stack exchange,提问作者Cesar Angiolucci
相关产品推荐
相关产品推荐

