【问题标题】:Nashorn - Can not find a common class loader for ScriptObject and MyInterfaceNashorn - 找不到 ScriptObject 和 MyInterface 的通用类加载器
【发布时间】:2016-11-29 22:53:38
【问题描述】:

我最近将我的 java 版本从 java 1.7 升级到了 java 1.8。升级后出现此错误。

原因: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;
        }
    }

【问题讨论】:

    标签: java nashorn


    【解决方案1】:

    为了让 Nashorn 实现你的接口,它必须(在运行时)创建一个新类,它既扩展了 ScriptObject(Nashorn 的内部原生 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 类。

    【讨论】:

    • 感谢您的回答阿提拉。我按照你的建议做了,得到了 ClassNotFoundException java.lang.ClassNotFoundException: jdk.nashorn.internal.runtime.ScriptObject from [Module "deployment.dep.war:main" from Service Module Loader]
    【解决方案2】:

    问题不在于代码。问题出在应用程序服务器上。 我使用的是 JBoss 6.4.0 应用服务器,问题是它在 EAP_HOME\modules\system\layers\base\sun\jdk\main 下的 module.xml 文件中没有 nashorn 路径。我将缺少的 nashorn 路径添加到上述路径中提到的 module.xml 文件中,它解决了我的问题。您也可以使用 Jboss 7.0 解决此问题,因为它默认具有 nashorn 路径。

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

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 1970-01-01
      • 2014-08-20
      • 2013-02-28
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多