Java 17+SpringBoot中GraalVM JavaScript ScriptEngine加载失败排查
Java 17迁移中GraalVM ScriptEngine加载失败的解决方案
核心问题分析
你的测试全部失败,主要是以下几个原因导致GraalVM的ScriptEngine无法被ScriptEngineManager发现:
缺失核心依赖
GraalVM的ScriptEngine实现依赖graal-sdk组件,你的pom.xml中未添加该依赖,导致ScriptEngine工厂类无法被加载。类加载器上下文问题
在Spring Boot测试环境中,默认的ScriptEngineManager()构造函数使用系统类加载器,可能无法扫描到GraalVM相关的工厂类,需要指定当前类的类加载器。测试环境模块访问限制
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
相关产品推荐
相关产品推荐

