ClassLoader中的Java 8 ScriptEngine

我需要在’不同的类加载器’内部执行一些javascript代码。 如果是java,则每个任务都将在单独的类加载器中运行。 现在我需要这个是javascript。

我是否需要在每个类加载器中创建ScriptEngine新实例,或者可以跨类加载器共享一个实例?

从你的问题来看,你不清楚为什么要寻找这样的类加载器隔离。 所以,我在这里总结了nashorn的类加载器 – 可能是,你会得到你正在寻找的东西。

Nashorn和类加载器:

  1. Nashorn类(jdk.nashorn。*)由Java扩展类加载器加载
  2. 生成的脚本类,适配器(子类,脚本中的接口实现)由nashorn的内部类加载器加载。
  3. 从脚本引用的Java类由Nashorn“app class loader”加载。

(1)和(2)不能定制。 在nashorn代码中有一些假设它是一个特权代码。 有关genarated脚本类加载器和适配器加载器的假设。

(3)默认情况下是nashorn引擎创建时的线程上下文类加载器。 如果线程上下文类加载器为null,则使用Nashorn自己的加载器 – 扩展加载器。

因此,如果在通过Thread.setContextClassLoader API设置合适的线程上下文加载器后创建Nashorn引擎,则可以控制脚本引擎的“app class loader”。

如果您可以使用NashornScriptEngineFactory(nashorn特定API https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html )来创建脚本引擎,您也可以以编程方式将任何类加载器作为“app class loader”传递。 您可能想要查看接受ClassLoader参数的NashornScriptEngineFactory方法。

除了“app class loader”之外,您还可以使用在“app class loader”之前搜索的另一个其他类加载器。 这由“-cp”或“-classpath”nashorn命令行选项指定。 请注意,您可以通过“nashorn.args”系统属性为脚本引擎指定nashorn命令行选项,或使用NashornScriptEngineFactory类的getScriptEngine方法以编程方式传递。 另见: https : //wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes

希望这可以帮助。