2016-11-29 311 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"/> 
相關問題