ClassLoader中的Java 8 ScriptEngine [英] Java 8 ScriptEngine across ClassLoaders

查看:104
本文介绍了ClassLoader中的Java 8 ScriptEngine的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to execute some javascript code 'inside' different classloaders. If it is java, each task will run in separate class loader. Now I need this to be javascript.

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

Do I need to create new instance of ScriptEngine in each classloader, or is it ok to share one across class loaders?

推荐答案

从你的问题不清楚你为什么要寻找这样的类加载器隔离。所以,我在这里总结nashorn的类加载器 - 也许,你会得到你想要的东西。

From your question it is not clear why'd you look for such classloader isolation. So, I'm summarizing nashorn's classloader here - may be, you'll get what you're looking for.

Nashorn和类加载器:

Nashorn and classloaders:


  1. Nashorn类(jdk.nashorn。*)由Java扩展类加载器加载

  2. 生成的脚本类,适配器(子类,来自脚本的接口实现)由nashorn的内部类加载器加载。

  3. 从脚本引用的Java类由Nashornapp class loader加载。

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

(1) and (2) can not be customized. There are assumptions in nashorn code that it's a privileged code. And there are assumptions about genarated script class loaders and adapter loaders.

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

(3) is by default the thread context classloader at the time of nashorn engine creation. If the thread context class loader is null, then Nashorn's own loader - the extension loader - is used.

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

So if you create Nashorn engine after setting suitable thread context loader via Thread.setContextClassLoader API, you can control script engine's "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方法。

If you're okay with using NashornScriptEngineFactory (nashorn specific API https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html) to create script engine, you can programmatically pass any classloader as "app class loader" as well. You may want to check out the NashornScriptEngineFactory methods that accept ClassLoader argument.

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

In addition to the "app class loader", optionally, you can also use another additional classloader that is searched before "app class loader". This is specified by "-cp" or "-classpath" nashorn command line option. Note that you can specify nashorn command line options for script engine via "nashorn.args" System property or programmatically pass using NashornScriptEngineFactory class's getScriptEngine methods. See also: https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes

希望这会有所帮助。

这篇关于ClassLoader中的Java 8 ScriptEngine的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆