igr*_*igr 5 java classloader java-8 nashorn
我需要在'不同的类加载器'内部执行一些javascript代码.如果是java,则每个任务都将在单独的类加载器中运行.现在我需要这个是javascript.
我是否需要ScriptEngine
在每个类加载器中创建新实例,或者可以跨类加载器共享一个实例?
A. *_*jan 11
从你的问题来看,你不清楚为什么要寻找这样的类加载器隔离.所以,我在这里总结nashorn的类加载器 - 也许,你会得到你正在寻找的东西.
Nashorn和类加载器:
(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
希望这可以帮助.