2016-11-29 2 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

Для того, чтобы Nashorn на крит реализация вашего интерфейса, он должен создать (во время выполнения) нового класса, что и расширяет ScriptObject (внутреннее родное объектное представления Насхорно в JS) и ваш интерфейс (скажем, он называется MyInterface).

Такой класс может быть создан только в JVM, если есть загрузчик классов, который может разрешать как ScriptObject, так и MyInterface. Поскольку ScriptObject обычно существует в пути ext classpath (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 из [Module "deployment.dep.war: main" из Service Module Loader] – Bhagat

0

Проблема была не в коде. Проблема была в сервере приложений. Я использовал сервер приложений JBoss 6.4.0, проблема заключалась в том, что у него не было nashorn-путей в файле module.xml в EAP_HOME \ modules \ system \ layers \ base \ sun \ jdk \ main. Я добавил отсутствующие пути 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"/> 

 Смежные вопросы

  • Нет связанных вопросов^_^