java 8 - Nashorn and OSGi: invocable.getInterface() : Can not find a common class loader for ScriptObject and MyInterface -


before updating ibm java 7 8 following code used work in equinox osgi environment:

scriptenginemanager manager = new scriptenginemanager(getclass().getclassloader()); scriptengine engine = manager.getscriptenginemanager().getenginebyextension("js"); engine.eval("<... js code ...>"); ((invocable) engine).getinterface(myinterface.class) // ecmascript exception 

in previous setup used rhino engine not registered available scriptenginefactory anymore still on classpath, "oracle nashorn".

after updating ibm java 8 (including nashorn) following exception:

    ecmascript exception: typeerror: can not find common class loader scriptobject , myinterface.         @ jdk.nashorn.internal.runtime.ecmaerrors.error(ecmaerrors.java:69)         @ jdk.nashorn.internal.runtime.ecmaerrors.typeerror(ecmaerrors.java:225)         @ jdk.nashorn.internal.runtime.ecmaerrors.typeerror(ecmaerrors.java:197)         @ jdk.nashorn.internal.runtime.ecmaerrors.typeerror(ecmaerrors.java:184)         @ jdk.nashorn.internal.runtime.linker.adaptationresult.typeerror(adaptationresult.java:82)         @ jdk.nashorn.internal.runtime.linker.javaadapterfactory$adapterinfo.getadapterclass(javaadapterfactory.java:326)         @ jdk.nashorn.internal.runtime.linker.javaadapterfactory.getadapterclassfor(javaadapterfactory.java:162)         @ jdk.nashorn.internal.runtime.linker.javaadapterfactory.getadapterclassfor(javaadapterfactory.java:148)         @ jdk.nashorn.internal.runtime.linker.javaadapterfactory.getconstructor(javaadapterfactory.java:202)         @ jdk.nashorn.api.scripting.nashornscriptengine.getinterfaceinner(nashornscriptengine.java:291)         @ jdk.nashorn.api.scripting.nashornscriptengine.getinterface(nashornscriptengine.java:216)         ... 

nashorn tries check if classloader of jdk.nashorn.internal.runtime.scriptfunction (ext classloader) can load given interface (bundle classloader) or vice versa via:

class.forname(classbname, false, clazza.getloader()) == classb; 

any ideas how configure osgi let 1 of classloaders see other or other workarounds working nashorn on java 8 + osgi?

according oracle docs, may initialize engine following example:

scriptenginemanager enginemanager = new scriptenginemanager();     scriptengine engine = enginemanager.getenginebyname("nashorn");     engine.eval(new filereader("src/sample2/xyz.js"));     invocable invocable = (invocable) engine; 

Comments