vor der Aktualisierung von IBM Java 7 bis 8 den folgenden Code verwendet, finden in einer Equinox OSGi-Umgebung zu arbeiten:Nashorn und OSGi: invocable.getInterface(): Kann nicht eine gemeinsame Klassenlader für Script und MyInterface
ScriptEngineManager manager = new ScriptEngineManager(getClass().getClassLoader());
ScriptEngine engine = manager.getScriptEngineManager().getEngineByExtension("js");
engine.eval("<... js code ...>");
((Invocable) engine).getInterface(MyInterface.class) // ECMAScript exception
In der vorherigen Konfiguration habe ich Rhino als Engine benutzt, die jetzt nicht mehr als ScriptEngineFactory registriert ist, aber immer noch im Klassenpfad, nur "Oracle Nashorn".
Nach IBM Java 8 Aktualisierung (einschließlich Nashorn) bekomme ich die folgende Ausnahme:
ECMAScript Exception: TypeError: Can not find a common class loader for ScriptObject and MyInterface.
at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:69)
at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:225)
at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:197)
at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:184)
at jdk.nashorn.internal.runtime.linker.AdaptationResult.typeError(AdaptationResult.java:82)
at jdk.nashorn.internal.runtime.linker.JavaAdapterFactory$AdapterInfo.getAdapterClass(JavaAdapterFactory.java:326)
at jdk.nashorn.internal.runtime.linker.JavaAdapterFactory.getAdapterClassFor(JavaAdapterFactory.java:162)
at jdk.nashorn.internal.runtime.linker.JavaAdapterFactory.getAdapterClassFor(JavaAdapterFactory.java:148)
at jdk.nashorn.internal.runtime.linker.JavaAdapterFactory.getConstructor(JavaAdapterFactory.java:202)
at jdk.nashorn.api.scripting.NashornScriptEngine.getInterfaceInner(NashornScriptEngine.java:291)
at jdk.nashorn.api.scripting.NashornScriptEngine.getInterface(NashornScriptEngine.java:216)
...
Nashorn versucht, zu überprüfen, ob die Klassenlader von jdk.nashorn.internal.runtime.ScriptFunction (Ext Classloader) geladen werden können die angegebene Schnittstelle (Bundle Classloader) oder umgekehrt über:
Class.forName(classBName, false, clazzA.getLoader()) == classB;
Irgendwelche Ideen, wie OSGi konfiguriert eine der Classloader zu lassen, die anderen oder andere Abhilfen für die Arbeit mit Nashorn auf Java 8 + OSGi sehen?
Dank für Ihre Antwort. Ich habe versucht, den ScriptEngineManager mit null und ohne Classloader als Parameter zu initialisieren, habe aber immer noch die selbe Ausnahme beim Aufruf von getInterface() auf dem Invocable. – Phil