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

Java 17+SpringBoot中GraalVM JavaScript ScriptEngine加载失败排查

Java 17迁移中GraalVM ScriptEngine加载失败的解决方案

核心问题分析

你的测试全部失败,主要是以下几个原因导致GraalVM的ScriptEngine无法被ScriptEngineManager发现:

  1. 缺失核心依赖
    GraalVM的ScriptEngine实现依赖graal-sdk组件,你的pom.xml中未添加该依赖,导致ScriptEngine工厂类无法被加载。

  2. 类加载器上下文问题
    在Spring Boot测试环境中,默认的ScriptEngineManager()构造函数使用系统类加载器,可能无法扫描到GraalVM相关的工厂类,需要指定当前类的类加载器。

  3. 测试环境模块访问限制
    Java 17的模块系统可能限制了GraalVM模块的访问,需要显式允许模块访问才能正常加载ScriptEngine。


具体修复步骤

1. 补充GraalVM SDK依赖

在pom.xml的<dependencies>中添加graal-sdk依赖,版本需与js、js-scriptengine保持一致:

<dependency>
    <groupId>org.graalvm.sdk</groupId>
    <artifactId>graal-sdk</artifactId>
    <version>23.0.4</version>
</dependency>

2. 修改ScriptEngineManager初始化逻辑

更新测试类中的getScriptEngineByName和getScriptEngineByExtension方法,使用当前类的类加载器初始化ScriptEngineManager:

private ScriptEngine getScriptEngineByName(String name){
    ScriptEngineManager manager = new ScriptEngineManager(getClass().getClassLoader());
    return manager.getEngineByName(name);
}

private ScriptEngine getScriptEngineByExtension(String extension){
    ScriptEngineManager manager = new ScriptEngineManager(getClass().getClassLoader());
    return manager.getEngineByExtension(extension);
}

3. 配置测试环境的模块访问权限

在pom.xml的<build><plugins>中添加maven-surefire插件配置,显式添加模块访问参数:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.2.5</version>
    <configuration>
        <argLine>--add-modules=org.graalvm.js,org.graalvm.js.scriptengine</argLine>
    </configuration>
</plugin>

验证修复

完成上述修改后,重新运行测试:

  • factoryTest会检测到GraalVM的ScriptEngineFactory实例
  • 其余测试方法均可成功获取到ScriptEngine实例,不再返回null

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:05:57