简体   繁体   中英

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

I am migrating my Eclipse RCP to use JDK 8 and I heavily use the JS ScriptEngine . Now that Nashorn is introduced I had to add the following line to get the importClass and importPackage functions to work:

load("nashorn:mozilla_compat.js");

After doing so, I got java.lang.NoClassDefFoundError: jdk/nashorn/api/scripting/JSObject .

I am using Nashorn inside an Eclipse RCP. The problem occurs when I call a Java function from the Javascript and try to use the parameter sent. The parameter I want to send is a Javascript function that I would like to execute call on later in the code.

I have the following code:

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

The problem occurs in line JSObject som = ((JSObject)o1); , although I can successfully import jdk.nashorn.api.scripting.JSObject; .

The exception message exactly says:

jdk.nashorn.api.scripting.JSObject cannot be found by com.test.nashorn_1.0.0.qualifier

So.. I got to fix my issue and was able to use JSObject in my code. What I have done was the following:

  • Added -Dorg.osgi.framework.bundle.parent=ext to myproduct.product file

This added it to the .ini file in my product build which revealed the classes found in Nashorn APIs.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM