Nashorn - 找不到ScriptObject和MyInterface的公共类加载器

时间:2016-11-29 22:53:39

标签: java nashorn

我最近将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;
        }
    }

2 个答案:

答案 0 :(得分:1)

为了让Nashorn创建一个接口的实现,它必须创建(在运行时)一个新类,它扩展ScriptObject(Nashorn的内部本机JS对象表示)和你的接口(假设它的名字叫{ {1}})。

如果有一个可以解析MyInterfaceScriptObject的类加载器,那么只能在JVM中创建这样的类。由于MyInterface通常存在于ext类路径(ScriptObject)中(在Java 8中),因此需要确保jre/lib/ext的类加载器具有所谓的“ext类加载器”。它的父类加载器链。这通常是正确的,因为大多数代码都是由JVM应用程序类加载器加载的。如果你有一个更复杂的类加载器设置(例如你在某种应用程序容器中),它可能不是真的。

基本上,看看这是否有效(我认为周围没有安全管理员......):

MyInterface

如果它引发ClassLoader myClassLoader = myScript.getScriptInterfaceClass().getClassLoader(); Class.forName("jdk.nashorn.internal.runtime.ScriptObject", true, myClassLoader); ,您需要找出ClassNotFoundException没有看到myClassLoader类的原因。

答案 1 :(得分:0)

问题不在于代码。问题出在应用服务器上。 我使用的是JBoss 6.4.0 Application Server,问题是它在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"/>