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
Post a Comment