Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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
Javascript 将Nashorn迁移到GraalVM以缓存和执行脚本_Javascript_Java_Graalvm - Fatal编程技术网

Javascript 将Nashorn迁移到GraalVM以缓存和执行脚本

Javascript 将Nashorn迁移到GraalVM以缓存和执行脚本,javascript,java,graalvm,Javascript,Java,Graalvm,所以我有一个java应用程序,它使用NashornScriptEngine创建一个编译脚本,然后我可以在其中创建一个Invocable。编译后的脚本是从一个文件输入编译而来的,这个文件输入就是我试图运行的js。然后我将这个Invocable缓存在一个映射中,以便以后执行。使用它非常简单 import javax.script.Invocable; public void handleEvent(Event event, Processor processor){ try {

所以我有一个java应用程序,它使用NashornScriptEngine创建一个编译脚本,然后我可以在其中创建一个Invocable。编译后的脚本是从一个文件输入编译而来的,这个文件输入就是我试图运行的js。然后我将这个Invocable缓存在一个映射中,以便以后执行。使用它非常简单

import javax.script.Invocable;

public void handleEvent(Event event, Processor processor){
    try {
        Invocable script = cache.get(event);
        if(script != null) {
            script.invokeFunction("run", data);
        } else {
            throw new UnsupportedOperationException(event.name());
        }
    } catch (Exception exception) ...
}
然而,由于Nashorn已被弃用,我正在尝试切换到GraalVM,同时实现同样的目标。我看到一些GitHub页面谈到了这一点,但老实说,这对我没有帮助。这里是我正在看的一些

这是我发现最有用的,但是它不允许我在上面的代码那样的入口点调用,也不允许我创建一个invocable来缓存和稍后调用

    public void compile(File file){
        try {
            Source source = Source.newBuilder("js", file).build();
            Engine engine = Engine.create();

            Context context = Context.newBuilder("js").engine(engine).option("js.nashorn-compat", "true").build();
            context.eval(source);
            context.close();
        } catch (Exception exception){
            exceptionCaught(exception);
        }
    }
关于如何使用GraalVM将文件(js)编译为invocable的任何提示?谢谢大家!

context.eval()
将返回类型为
org.graalvm.polyglot.value
的值。当
返回一个
函数
时,该值将用
回答
canExecute()
,您可以
值。重复执行(args…
)。请参见价值API:

我看到您正在设置
nashorn compat
选项。请理解这是一个向后兼容选项,最好不要使用。在许多情况下,如果没有该选项,代码将可以完美运行。请检查Nashorn模式下可用的GraalVM JavaScript是否确实不支持某些内容。

context.eval()
将返回类型为
org.GraalVM.polyglot.value
的值。当
返回一个
函数
时,该值将用
回答
canExecute()
,您可以
值。重复执行(args…
)。请参见价值API:

我看到您正在设置
nashorn compat
选项。请理解这是一个向后兼容选项,最好不要使用。在许多情况下,如果没有该选项,代码将可以完美运行。请检查在Nashorn模式下可用的GraalVM JavaScript是否确实不支持某些内容。

请参阅。可能不需要进一步更改。请参阅。可能无需进一步修改。