【问题标题】:Nashorn java.lang.NoClassDefFoundError: jdk/nashorn/api/scripting/JSObjectNashorn java.lang.NoClassDefFoundError: jdk/nashorn/api/scripting/JSObject
【发布时间】:2019-01-13 18:08:00
【问题描述】:

我正在迁移我的 Eclipse RCP 以使用 JDK 8,并且我大量使用 JS ScriptEngine。既然引入了 Nashorn,我必须添加以下行以使 importClassimportPackage 函数工作:

load("nashorn:mozilla_compat.js");

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

我在 Eclipse RCP 中使用 Nashorn。当我从Javascript 调用Java 函数并尝试使用发送的参数时,就会出现问题。我要发送的参数是一个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

【问题讨论】:

  • Nashorn 将在 Java 11 中被弃用(我的最后一条信息)。做一些研究并检查不属于 JDK 的替代方案可能是值得的。例如:嵌入 V8 Javascript 引擎的 J2V8 项目可在 Maven Central 上使用,并且 JAR 文件包含 OSGi MANIFEST 标头。我还没有尝试过(它在我的任务列表中)所以如果你尝试它并且它对你有用,请告诉我:)。
  • @BalazsZsoldos 老实说,我不知道在我的应用程序中添加另一个第三方依赖项是否是正确的做法。如果我采取您建议的路线,我会通知您。谢谢

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多