作者:手机用户2502885897 | 来源:互联网 | 2022-12-05 18:58
我正在开发一个需要执行Javascript的Java应用程序.Nashorn JS引擎即将被弃用,替换是Graal SDK提供的一组API,它使用GraalVM.基本上执行多种语言的虚拟机.
至少这是我的想法.所以我花了一天时间试图让它运转起来.我下载了使用JDK 8的GraalVM rc6.我使用IntelliJ IDEA,并将GraalVM添加为新的JDK.我发现奇怪的是我应该添加一个虚拟机作为开发工具包,但我知道它基于JDK 8,所以我很好.
而问题与其他问题不同,我无法让新的软件包运行起来.我的IDE告诉我它无法解决它们.
实际上,没有一个org.graalvm软件包可以解析.
所以我下载了JDK 11 build 28,因为据我所知JDK 11自20版开始就附带了GraalVM.
实际上,在这种情况下,可以找到一些软件包,但远远低于预期:例如org.graalvm.polyglot仍然无法解析.
最后,我尝试从Maven添加Graal SDK并解决了包.现在我在运行时遇到异常:
Context ctx = Context.create(“js”);
在类路径上找不到语言和多语言实现.确保truffle-api.jar在类路径上.
我认为前两个案例中的问题实际上并没有获得GraalVM JDK,但它甚至以这种方式抛出了异常.
有经验的人可以解释一下吗?
1> Oleg Šelajev..:
GraalVM
GraalVM是一个高性能的可嵌入多语言虚拟机,目前支持许多编程语言:Java(和JVM语言),Javascript(包括node.js),Ruby,R,Python和C/C++以及其他具有LLVM后端的语言.
您可以在此处下载预先构建的GraalVM分发版:https://www.graalvm.org/downloads
.除此之外,它还包括一个java运行时,一个节点运行时,一个名为Graal.js的Javascript引擎等.
Graal SDK是多语言API,允许GraalVM使用它可以运行的所有语言实现.这个多语言API打包为一个jar文件:$GRAALVM_HOME/jre/lib/boot/graal-sdk.jar
.
将该文件作为外部库添加到您的IDEA项目/模块中,将允许IDE找到类似以下的类:org.graalvm.polyglot.Context
以及org.graalvm.polyglot.Value
与语言互操作所必需的类
,包括Javascript实现.
如果您的项目使用Maven,您可以在该文件上添加系统依赖项,maven将在任何$JAVA_HOME
设置为指向GraalVM分发的系统上找到它
.
org.graalvm
graal-sdk
1.0.0-rc
system
${java.home}/lib/boot/graal-sdk.jar
现在,当您java
从GraalVM发行版运行命令时,必要的文件将自动添加到类路径中.因此,在IDE中运行类似下面的内容不再需要:
import org.graalvm.polyglot.*;
public class Main {
public static void main(String[] args) {
Context polyglot = Context.create();
Value array = polyglot.eval("js", "[1,2,42,4]");
System.out.println(array.getArrayElement(2).asInt());
}
}
现在这是因为GraalVM默认启用了Graal.js Javascript引擎.
如果要在库存JDK上运行它,则需要向类路径添加更多内容.
在股票JDK上运行Graal.js**
关于如何在股票JDK上运行Graal.js有这个问题:如何使用graaljs?有没有地方可以获得.jar文件/文件?.接受的答案详细说明了在哪里找到必要的jar文件以使其在Java 8上运行.
简而言之,您需要将以下jar文件添加到类路径中以使其实际运行:
graal-sdk.jar - GraalVM多语言API
truffle-api.jar - 语言实现的API.
graaljs.jar - 这是GraalVM的Javascript引擎的实现
graaljs-scriptengine.jar - 允许通过Java脚本引擎API使用Graal.js.
graaljs-launcher.jar
tregex.jar - 正则表达式库
truffle-profiler.jar - 用于松露语言实现的分析器
chromeinspector.jar - 调试器集成
发射-common.jar
您可以在下载的GraalVM发行版中找到它们,两个版本都可以正常工作.
现在没有Graal编译器,Javascript引擎的性能将不是最佳的.正如您自己提到的那样,JDK 11附带了Graal 编译器的快照(而非GraalVM,它是GraalVM项目的完整分发,包括JS enginer,LLVM bitcode解释器,节点实现,JVM等).您可以通过传递--XX:+UnlockExperimentalVMOptions --XX:+UseJVMCICompiler
给java
命令来启用Graal编译器
.
现在在JDK 11上运行它可能不起作用,因为JDK 11与JDK 8有很大不同,可能存在模块系统问题或缺少的东西(如jax-b),但它也可能有效.它适用于JDK 8.