Javascript 将Nashorn迁移到GraalVM以缓存和执行脚本
所以我有一个java应用程序,它使用NashornScriptEngine创建一个编译脚本,然后我可以在其中创建一个Invocable。编译后的脚本是从一个文件输入编译而来的,这个文件输入就是我试图运行的js。然后我将这个Invocable缓存在一个映射中,以便以后执行。使用它非常简单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 {
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是否确实不支持某些内容。请参阅。可能不需要进一步更改。请参阅。可能无需进一步修改。