如何让Graal SDK包在没有Maven的情况下工作?

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,但它甚至以这种方式抛出了异常.

有经验的人可以解释一下吗?

Ole*_*jev 8

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分发的系统上找到它 .

<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**

关于如何在股票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:+UseJVMCICompilerjava命令来启用Graal编译器 .

现在在JDK 11上运行它可能不起作用,因为JDK 11与JDK 8有很大不同,可能存在模块系统问题或缺少的东西(如jax-b),但它也可能有效.它适用于JDK 8.