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

时间:2018-08-06 18:13:09

标签: java java-8 osgi eclipse-rcp nashorn

我正在将Eclipse RCP迁移为使用JDK 8,并且大量使用了JS ScriptEngine。现在介绍了Nashorn,我必须添加以下行以使importClassimportPackage函数起作用:

load("nashorn:mozilla_compat.js");

这样做之后,我得到了 java.lang.NoClassDefFoundError: jdk/nashorn/api/scripting/JSObject

我正在Eclipse RCP中使用Nashorn。当我从Java调用Javascript函数并尝试使用发送的参数时,会发生问题。我要发送的参数是一个Javascript函数,我希望稍后在代码中执行call

我有以下代码:

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);
}

问题可以在JSObject som = ((JSObject)o1);行中发生,尽管我可以成功import jdk.nashorn.api.scripting.JSObject;

该异常消息准确地说:

  com.test.nashorn_1.0.0.qualifier找不到

jdk.nashorn.api.scripting.JSObject

1 个答案:

答案 0 :(得分:0)

所以..我必须解决我的问题,并且能够在代码中使用JSObject。我所做的是:

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

这将其添加到我的产品版本的.ini文件中,该文件显示了Nashorn API中的类。