2016-07-21 63 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"/>