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

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配置项中追加以下参数:
    --add-exports jdk.dynalink/jdk.dynalink=ALL-UNNAMED
    
    保存后重启WildFly服务生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:36:16