我正在尝试在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)
engine.eval(getJSReaderFromResorces("env.nashorn.1.2.js"));
这个脚本似乎使用了名为"jdk.nashorn.internal.runtime.Context"的Nashorn内部类。这来自一个名为"jdk.nashorn.internal.runtime"的包。当您在安全管理器上运行时,这个包是受访问保护的,因此对脚本不可见。
在任何情况下,访问nashorn内部/实现类都是一个好主意——因为它们没有兼容性保证。
在java 9中,这些包不会从nashorn模块导出,因此无论安全管理器是否打开,都无法访问。