Pat*_*zer 5 java java-8 graalvm java-11
我正在开发一个需要执行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”);
Run Code Online (Sandbox Code Playgroud)
在类路径上找不到语言和多语言实现.确保truffle-api.jar在类路径上.
我认为前两个案例中的问题实际上并没有获得GraalVM JDK,但它甚至以这种方式抛出了异常.
有经验的人可以解释一下吗?
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分发的系统上找到它
.
<dependency>
<groupId>org.graalvm</groupId>
<artifactId>graal-sdk</artifactId>
<version>1.0.0-rc</version>
<scope>system</scope>
<systemPath>${java.home}/lib/boot/graal-sdk.jar</systemPath>
</dependency>
Run Code Online (Sandbox Code Playgroud)
现在,当您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());
}
}
Run Code Online (Sandbox Code Playgroud)
现在这是因为GraalVM默认启用了Graal.js JavaScript引擎.
如果要在库存JDK上运行它,则需要向类路径添加更多内容.
关于如何在股票JDK上运行Graal.js有这个问题:如何使用graaljs?有没有地方可以获得.jar文件/文件?.接受的答案详细说明了在哪里找到必要的jar文件以使其在Java 8上运行.
简而言之,您需要将以下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.