Search code examples
javawildflyjava-11nashorn

Standalone Nashorn giving java.lang.NoClassDefFoundError: jdk/dynalink/RelinkableCallSite using java 11


I was using nashorn built-in java 11, but i need functionality from newest standalone version. However, when i'm using

ScriptEngine engine = new org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory().getScriptEngine();

and later use evaling script, i got:

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

Its a maven project in war, deployed on wildfly. When i'm importing jdk/dynalink/RelinkableCallSite it is there, so i can't find solution.

Thanks in advance for Your help.


Solution

  • We have found the solution. Wildfly was exporting JDK modules and packing them within itself, but it took the ones from nashorn built-in java 11, which used an older version of dynalink - jdk/internal/dynalink. To resolve the problem we have exported the modules in jboss-deployment-structure.xml :

    <system export="true">
        <paths>
            <path name="jdk/dynalink"/>
            <path name="jdk/dynalink/beans"/>
            <path name="jdk/dynalink/linker"/>
            <path name="jdk/dynalink/linker/support"/>
            <path name="jdk/dynalink/support"/>
        </paths>
    </system>