Java11使用独立版Nashorn抛出NoClassDefFoundError异常求助
问题背景
原使用Java 11内置Nashorn脚本引擎,因功能需求切换为独立发布的最新版Nashorn,使用如下代码初始化脚本引擎:
ScriptEngine engine = new org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory().getScriptEngine();
执行脚本求值操作时抛出异常,异常栈如下:
java.lang.NoClassDefFoundError: jdk/dynalink/RelinkableCallSite at org.openjdk.nashorn.internal.runtime.Context.<init>(Context.java:655) at org.openjdk.nashorn.internal.runtime.Context.<init>(Context.java:585) at org.openjdk.nashorn.api.scripting.NashornScriptEngine.lambda$new$0(NashornScriptEngine.java:126) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at org.openjdk.nashorn.api.scripting.NashornScriptEngine.<init>(NashornScriptEngine.java:124) at org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory.getScriptEngine(NashornScriptEngineFactory.java:152) at com.jthink.songkong.analyse.filename.FileNameFormatter.getRenameMaskJavascriptEngine(FileNameFormatter.java:668) at com.jthink.songkong.analyse.filename.FileNameFormatter.isAlbumMask(FileNameFormatter.java:752) at com.jthink.songkong.analyse.filename.FileNameFormatter.isAlbumMask(FileNameFormatter.java:732) at com.jthink.songkong.analyse.analyser.SongSaver.init(SongSaver.java:130) at com.jthink.songkong.analyse.toplevelanalyzer.FixSongsController.reset(FixSongsController.java:164) at com.jthink.songkong.analyse.toplevelanalyzer.FixSongsController.start(FixSongsController.java:185) at com.jthink.songkong.ui.swingworker.FixSongs.doInBackground(FixSongs.java:49) at com.jthink.songkong.ui.swingworker.FixSongs.doInBackground(FixSongs.java:18) at java.desktop/javax.swing.SwingWorker$1.call(SwingWorker.java:304) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.desktop/javax.swing.SwingWorker.run(SwingWorker.java:343) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.ClassNotFoundException: jdk.dynalink.RelinkableCallSite at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 20 more
运行环境信息:
- 项目为Maven构建的WAR包
- 部署在WildFly应用服务器
- 已确认
jdk.dynalink.RelinkableCallSite类存在于运行环境中,可正常导入,但无法定位异常根因。
根因分析
该异常由WildFly模块化类加载机制导致:独立版Nashorn依赖JDK的jdk.dynalink模块,WildFly默认不会为Web应用类加载器开放该JDK模块的访问权限,即使类本身存在于JDK环境中,应用上下文也无法加载该类,最终抛出NoClassDefFoundError。
解决方案
按优先级依次尝试以下方案:
- 添加WildFly部署依赖配置
在WAR包的WEB-INF目录下创建jboss-deployment-structure.xml文件,显式声明对jdk.dynalink模块的依赖,配置内容如下:
配置完成后重新打包部署即可。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.9"> <deployment> <dependencies> <module name="jdk.dynalink" export="true"/> </dependencies> </deployment> </jboss-deployment-structure> - 校验Maven依赖配置
确认pom.xml中独立版Nashorn的依赖配置正确,且依赖范围未设置为provided,需随应用包一同发布。Java 11环境适配的依赖配置参考:<dependency> <groupId>org.openjdk.nashorn</groupId> <artifactId>nashorn-core</artifactId> <version>15.4</version> </dependency> - 添加JVM启动参数显式导出模块
若上述配置无效,可修改WildFly启动配置,编辑standalone.conf(单机部署)或domain.conf(域部署)文件,在JAVA_OPTS配置项中追加以下参数:
保存后重启WildFly服务生效。--add-exports jdk.dynalink/jdk.dynalink=ALL-UNNAMED
内容的提问来源于stack exchange,提问作者Kontaro
相关产品推荐
相关产品推荐

