2016-07-21 65 views
0

一個類加載器從IBM更新的Java 7〜8使用在春分OSGi的環境中工作,下面的代碼:之前犀牛和OSGi:invocable.getInterface():無法找到ScriptObject和MyInterface的

ScriptEngineManager manager = new ScriptEngineManager(getClass().getClassLoader()); 
ScriptEngine engine = manager.getScriptEngineManager().getEngineByExtension("js"); 
engine.eval("<... js code ...>"); 
((Invocable) engine).getInterface(MyInterface.class) // ECMAScript exception 

在之前的設置中,我使用Rhino作爲引擎,現在不再註冊爲可用的ScriptEngineFactory,但仍在類路徑中,只有「Oracle Nashorn」。

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) 
     ... 

犀牛試圖檢查jdk.nashorn.internal.runtime.ScriptFunction(擴展類加載器)的類加載器可以加載:

更新到IBM的Java 8(包括犀牛)我得到下面的異常後定的接口(捆綁類加載器),或者反之亦然通過:

Class.forName(classBName, false, clazzA.getLoader()) == classB; 

任何想法如何配置的OSGi讓類加載器的一個看對方或其他解決方法與犀牛Java的8 + OSGi的工作?

回答

0

據Oracle文檔,你可以初始化引擎,如下面的例子:

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

謝謝您的回答。我嘗試使用null初始化ScriptEngineManager,沒有使用任何類加載器作爲參數,但在Invocable上調用getInterface()時仍然得到相同的異常。 – Phil

0

的問題是不是與代碼。問題出在應用程序服務器上。 我在使用JBoss 6.4.0應用服務器,問題是它沒有在EAP_HOME \ modules \ system \ layers \ base \ sun \ jdk \ main下的module.xml文件中有nashorn路徑。我將缺少的nashorn路徑添加到上述路徑中提到的module.xml文件中,並解決了我的問題。你也可以通過使用Jboss 7.0來解決這個問題,因爲它默認具有nashorn路徑。

缺少犀牛路

   <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"/>