Nashorn java.lang.NoClassDefFoundError:jdk/Nashorn/api/scripting/JSObject

Nashorn java.lang.NoClassDefFoundError:jdk/Nashorn/api/scripting/JSObject,java,java-8,osgi,eclipse-rcp,nashorn,Java,Java 8,Osgi,Eclipse Rcp,Nashorn,我正在迁移我的eclipsercp以使用jdk8,并且我大量使用JSScriptEngine。既然引入了Nashorn,我必须添加以下行以使importClass和importPackage函数正常工作: load("nashorn:mozilla_compat.js"); 这样做之后,我得到了java.lang.NoClassDefFoundError:jdk/nashorn/api/scripting/JSObject 我正在Eclipse RCP中使用Nashorn。当我从Javascr

我正在迁移我的
eclipsercp
以使用
jdk8
,并且我大量使用JS
ScriptEngine
。既然引入了
Nashorn
,我必须添加以下行以使
importClass
importPackage
函数正常工作:

load("nashorn:mozilla_compat.js");
这样做之后,我得到了java.lang.NoClassDefFoundError:jdk/nashorn/api/scripting/JSObject

我正在Eclipse RCP中使用Nashorn。当我从
Javascript
调用
Java
函数并尝试使用发送的参数时,就会出现问题。我想发送的参数是一个
Javascript
函数,我想在代码的后面执行
调用

我有以下代码:

TestNashorn.java

package com.test.nashorn;

import java.io.FileNotFoundException;
import java.io.FileReader;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.Invocable;

import jdk.nashorn.api.scripting.JSObject;

public class TestNashorn {

    public static void main(String[] args) {
        ScriptEngine engine = (new ScriptEngineManager()).getEngineByName("js");
        try {
            engine.eval(new FileReader("C:/Users/user/workspace_nashorn/TestNashorn/src/com/test/nashorn/test.js"));
            Object o = ((Invocable)engine).invokeFunction("generate");
        } catch (ScriptException | FileNotFoundException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public static int test(JSObject o1) {
        System.out.println(o1.getClass().toString());
        JSObject som = ((JSObject)o1);
        return 1;
    }
}
test.js

load("nashorn:mozilla_compat.js");
importClass(com.test.nashorn.TestNashorn);

function generate()
{
    function asd(variablex) { print('Hello, ' + variablex); }
    var result = TestNashorn.test(asd);
}
问题出现在第
jsobjectsom=((JSObject)o1)行,尽管我可以成功地
导入jdk.nashorn.api.scripting.JSObject

异常消息确切地说:

com.test.nashorn_1.0.0.0找不到jdk.nashorn.api.scripting.JSObject


所以。。我解决了我的问题,并且能够在代码中使用
JSObject
。我所做的工作如下:

  • -Dorg.osgi.framework.bundle.parent=ext
    添加到
    myproduct.product
    文件

这将它添加到我的产品构建中的
.ini
文件中,该文件显示了在
Nashorn
api中找到的类。

Nashorn将在Java11中被弃用(我最后的信息)。也许值得做一点研究,检查不属于JDK的替代方案。例如:J2V8项目,该项目嵌入了Maven Central上可用的V8 Javascript引擎,JAR文件包含OSGi清单头。我还没有尝试过它(它在我的任务列表上),所以如果你尝试过,并且它对你有效,请让我知道:)。@BalazsSoldos我不知道在我的应用程序中添加另一个第三方依赖项是否是目前正确的做法。如果我走你建议的路线,我会告诉你的。谢谢