2016-07-21 10 views
0

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?

Antwort

0

Laut Oracle Text & Tabellen können Sie Ihren Motor wie das folgende Beispiel initialisieren:

ScriptEngineManager engineManager = new ScriptEngineManager(); 
    ScriptEngine engine = engineManager.getEngineByName("nashorn"); 
    engine.eval(new FileReader("src/sample2/xyz.js")); 
    Invocable invocable = (Invocable) engine; 
+0

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

0

Das Problem war nicht mit dem Code. Das Problem war mit dem Anwendungsserver. Ich benutzte JBoss 6.4.0 Application Server, das Problem war, dass es keine Nashorn-Pfade in der module.xml-Datei unter EAP_HOME \ modules \ system \ layers \ base \ sun \ jdk \ main hatte. Ich habe die fehlenden Nashorn-Pfade zu der im obigen Pfad erwähnten Datei module.xml hinzugefügt und das Problem wurde behoben. Sie können das Problem auch lösen, indem Sie Jboss 7.0 verwenden, da es standardmäßig die Nashorn-Pfade enthält.

Fehlende nashorn Pfade

   <path name="jdk/nashorn/api/scripting"/> 
       <path name="jdk/nashorn/api/scripting/resources"/> 
       <path name="jdk/nashorn/internal/codegen"/> 
       <path name="jdk/nashorn/internal/codegen/types"/> 
       <path name="jdk/nashorn/internal/ir"/> 
       <path name="jdk/nashorn/internal/ir/annotations"/> 
       <path name="jdk/nashorn/internal/ir/debug"/> 
       <path name="jdk/nashorn/internal/ir/visitor"/> 
       <path name="jdk/nashorn/internal/lookup"/> 
       <path name="jdk/nashorn/internal/objects"/> 
       <path name="jdk/nashorn/internal/objects/annotations"/> 
       <path name="jdk/nashorn/internal/parser"/> 
       <path name="jdk/nashorn/internal/runtime"/> 
       <path name="jdk/nashorn/internal/runtime/arrays"/> 
       <path name="jdk/nashorn/internal/runtime/linker"/> 
       <path name="jdk/nashorn/internal/runtime/options"/> 
       <path name="jdk/nashorn/internal/runtime/regexp"/> 
       <path name="jdk/nashorn/internal/runtime/regexp/joni"/> 
       <path name="jdk/nashorn/internal/runtime/resources"/> 
       <path name="jdk/nashorn/internal/runtime/resources/fx"/> 
       <path name="jdk/nashorn/internal/runtime/scripts"/> 
       <path name="jdk/nashorn/internal/tools"/> 
       <path name="jdk/nashorn/internal/tools/resources"/> 
       <path name="jdk/internal/dynalink"/> 
       <path name="jdk/internal/dynalink/beans"/> 
       <path name="jdk/internal/dynalink/linker"/> 
       <path name="jdk/internal/dynalink/support"/> 
Verwandte Themen