Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跨类加载器的Java8脚本引擎_Java_Java 8_Classloader_Nashorn - Fatal编程技术网

跨类加载器的Java8脚本引擎

跨类加载器的Java8脚本引擎,java,java-8,classloader,nashorn,Java,Java 8,Classloader,Nashorn,我需要在不同的类加载器中执行一些javascript代码。如果是java,则每个任务将在单独的类装入器中运行。现在我需要这是javascript 我是否需要在每个类加载器中创建ScriptEngine的新实例,还是可以跨类加载器共享一个实例?从您的问题来看,不清楚您为什么要寻找这样的类加载器隔离。所以,我在这里总结nashorn的类加载器-也许,你会得到你想要的 Nashorn和类加载器: Nashorn类(jdk.Nashorn.*)由Java扩展类加载器加载 生成的脚本类、适配器(子类、脚本

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


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

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

Nashorn和类加载器:

  • Nashorn类(jdk.Nashorn.*)由Java扩展类加载器加载
  • 生成的脚本类、适配器(子类、脚本中的接口实现)由nashorn的内部类装入器装入
  • 脚本中引用的Java类由Nashorn“应用程序类加载器”加载
  • (1) 和(2)无法自定义。nashorn代码中有一些假设,认为它是一个特权代码。还有一些关于脚本类加载器和适配器加载器的假设

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

    所以,如果您在通过thread.setContextClassLoader API设置合适的线程上下文加载器后创建Nashorn引擎,您可以控制脚本引擎的“应用程序类加载器”

    如果您对使用NashornScriptEngineFactory(特定于nashorn的API)创建脚本引擎没有意见,那么您也可以通过编程将任何类加载器作为“应用类加载器”传递。您可能希望签出接受ClassLoader参数的NashornScriptEngineFactory方法

    除了“应用程序类加载器”,您还可以选择使用在“应用程序类加载器”之前搜索的另一个附加类加载器。这由“-cp”或“-classpath”nashorn命令行选项指定。请注意,您可以通过“nashorn.args”系统属性为脚本引擎指定nashorn命令行选项,或使用NashornScriptEngineFactory类的getScriptEngine方法以编程方式传递。另见:


    希望这有帮助。

    “如果您创建了Nashorn引擎”-您是指
    新的ScriptEngineManager()。getEngineByName(“Nashorn”)
    ?换句话说,这总是创建新的
    ScriptEngine
    ;在调用此方法之前,我应该设置threadctx类加载器?是的,这就是我的意思-在创建新的nashorn引擎之前设置thread context类加载器。Thanx,你说的一切都很完美。嗨,我也有同样的问题,并将自定义类加载器应用为thread的contextClassLoader,但它似乎不起作用,有什么想法吗!