java - Nashorn - 找不到 ScriptObject 和 MyInterface 的通用类加载器

标签 java nashorn

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

原因:ECMAScript 异常:类型错误:找不到 ScriptObject 和我的接口(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;
        }
    }

最佳答案

为了让 Nashorn 实现您的接口(interface),它必须(在运行时)创建一个新类,该类既扩展 ScriptObject (Nashorn 的内部原生 JS 对象表示)和您的接口(interface)(比方说它被命名为MyInterface)。

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

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

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

如果它抛出 ClassNotFoundException,您需要找出为什么 myClassLoader 没有看到 ScriptObject 类。

关于java - Nashorn - 找不到 ScriptObject 和 MyInterface 的通用类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40877274/

相关文章:

javascript - Nashorn:奇怪的包裹返回

java-8 - Java 8 纳肖恩 : Console pretty unusable

java - Nashorn 的 Object.bindProperties() 方法

java - OkHttpClient 拦截器未设置

java - 如何检查正在运行的 JAR 存档内有什么内容?

java - 为什么 Jackson 在我自动生成的 POJO 枚举中忽略 @JsonCreator 注释?

java - 分配 ListView ID 错误 - Android Studio

java - 我正在尝试在我的 Android 应用程序中添加一个微调器

javascript - Nashorn JavaScript : NativeTypeError

javascript - Nashorn:在命名空间内调用函数