2016-11-29 312 views
0

我最近将java版本从java 1.7升级到java 1.8。升级后,我得到这个错误。Nashorn - 无法为ScriptObject和MyInterface找到常见的类加载器

引起:ECMAScript异常:类型错误:找不到ScriptObject和My Interface的通用类加载器。

请帮我解决这个问题。

下面是我的方法

private final ScriptEngine engine; 
ScriptEngineManager sem = new ScriptEngineManager(); 
engine = sem.getEngineByName("nashorn"); 

public <K> K getNewInterface(MyScript myScript){ 
     ScriptContext ctx = new SimpleScriptContext(); 
     String script = myScript.getScript(); 
     if(Strings.isEmpty(script)) {markInvalid(myScript, "Script is empty", null); return null;} 
     script += " (function(){return this;})();"; 
     Object thiz; 
     try{ 
      thiz = engine.eval(script, ctx); 
     } catch (ScriptException e){ 
      markInvalid(myScript, "Can't execute script", e); 
      return null; 
     } 
     if(thiz==null) {markInvalid(myScript, "Script executed, but context is null", null); return null;} 
     K ret = (K) ((Invocable)engine).getInterface(thiz, myScript.getScriptInterfaceClass()); 
     if(ret==null) { 
      markInvalid(myScript, "Script executed, but it's incompatible with required interface", null); 
      return null; 
     }else{ 
      myScript.setValid(true); 
      return ret; 
     } 
    } 

回答

1

为了让犀牛克里特岛的接口的实现,它必须创建(在运行时)一个新的类,这两个扩展ScriptObject(犀牛的内部本地JS对象表示)和你的界面(假设它被命名为MyInterface)。

只有在可以解析ScriptObjectMyInterface的类加载器时才能在JVM中创建此类。由于ScriptObject通常存在于ext类路径(jre/lib/ext)(Java 8中)中,因此需要确保MyInterface的类加载器在其父类加载器链中具有所谓的“ext类加载器”。这通常是正确的,因为大多数代码是由JVM应用程序类加载器加载的。如果您有更详细的类加载器设置(例如,您处于某种应用程序容器中),则可能不是这样。

基本上,看看这是否正常工作(我相信没有安全管理器周围...):

ClassLoader myClassLoader = myScript.getScriptInterfaceClass().getClassLoader(); 
Class.forName("jdk.nashorn.internal.runtime.ScriptObject", true, myClassLoader); 

如果它抛出一个ClassNotFoundException,你需要找出为什么不myClassLoader看到ScriptObject类。

+0

谢谢您的回答阿提拉。我按照您的建议做了并且得到了ClassNotFoundException java.lang.ClassNotFoundException:jdk.nashorn.internal.runtime.ScriptObject from [Module“deployment.dep.war:main”from Service Module Loader] – Bhagat

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"/> 
相关问题