我正在尝试在openjdk版本“1.8.0_91”中使用Nashorn。我的代码如下所示。
ScriptEngineManager manager = new ScriptEngineManager(null);
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.eval(getJSReaderFromResorces("env.nashorn.1.2.js"));
它在最后一行抛出异常,如下所示。
Caused by: java.lang.ClassNotFoundException: jdk.nashorn.internal.runtime.Context.getContext
at jdk.nashorn.internal.runtime.NativeJavaPackage.classNotFound(NativeJavaPackage.java:162)
at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:1249)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:623)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
答案 0 :(得分:0)
engine.eval(getJSReaderFromResorces("env.nashorn.1.2.js"));
看来这个脚本使用名为“jdk.nashorn.internal.runtime.Context”的Nashorn内部类。这是一个名为“jdk.nashorn.internal.runtime”的包。当您启用安全管理器运行时,此程序包受访问保护,因此脚本不可见。
在任何情况下,访问nashorn内部/实现类都是一个好主意 - 因为没有兼容性保证。
使用java 9,这些软件包不会从nashorn模块导出,因此无论安全管理器是否打开/关闭都无法访问。