ClassLoaders中的Java 8 ScriptEngine

igr*_*igr 5 java classloader java-8 nashorn

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

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

A. *_*jan 11

从你的问题来看,你不清楚为什么要寻找这样的类加载器隔离.所以,我在这里总结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

希望这可以帮助.

  • 是的,这就是我的意思 - 在创建新的nashorn引擎之前设置线程上下文类加载器. (3认同)