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

How to get Graal SDK packages to work without Maven?

我正在开发一个需要执行的 Java 应用程序 Java脚本。 Nashorn JS 引擎即将被弃用 替换为 Graal SDK 提供的 API 集 它使用了 GraalVM。本质上是虚拟机 执行多种语言。

至少我是这么认为的。 所以我花了一天时间让它工作。我下载了使用 JDK 8 的 GraalVM rc6。我使用 IntelliJ IDEA 并添加了 GraalVM 作为新的 JDK。我觉得很奇怪,我应该添加一个虚拟机作为开发工具包,但我知道它是基于 JDK 8 所以我没问题。

这个问题与其他问题不同,我无法让新包工作。我的 IDE 告诉我它无法解决它们。

实际上,org.graalvm 个软件包中的 none 个可以解决。

所以我下载了 JDK 11 build 28,因为据我所知 JDK 11 自 build 20 以来就带有 GraalVM。

实际上,在这种情况下,可以找到一些包,但远低于预期:例如org.graalvm.polyglot 仍然无法解析。

最后,我尝试从 Maven 添加 Graal SDK 并且包已解决。现在我在 运行:

时得到一个异常
Context ctx = Context.create(“js”);

在类路径中未找到任何语言和多语言实现。确保 truffle-api.jar 在类路径中。

我以为前2种情况其实是没有获取到GraalVM的问题JDK,但是这样还是会抛出异常

哪位有经验的能解释一下吗?

所以我发现了问题。 IntelliJ IDEA 非常习惯于 它未加载的标准 JDK 主页结构 Graal SDK 和其他 API。

使我更接近结果的 Maven jar 文件是 与 GraalVM 捆绑的文件完全相同。

GraalVM

GraalVM 目前是一个高性能的可嵌入多语言虚拟机 支持多种编程语言:Java(和 JVM 语言), JavaScript(包括node.js)、Ruby、R、Python、C/C++等语言 使用 LLVM 后端。

您可以在此处下载 GraalVM 的预构建发行版: https://www.graalvm.org/downloads。 其中包括一个 java 运行 时间、一个节点 运行 时间、一个名为 Graal.js 的 Java 脚本引擎等

Graal SDK 是多语言 API 允许 GraalVM 使用它可以使用的所有语言实现 运行。 此多语言 API 打包为 jar 文件:$GRAALVM_HOME/jre/lib/boot/graal-sdk.jar.

将该文件作为外部库添加到您的 IDEA 项目/模块中,将允许 IDE 找到 类,例如: org.graalvm.polyglot.Contextorg.graalvm.polyglot.Value 是与语言互操作所必需的,包括 Java脚本实现。

如果您的项目正在使用 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>

现在,当您从 GraalVM 发行版中 运行 java 命令时,必要的文件将自动添加到类路径中。 因此,运行 中 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 Java脚本引擎。

如果你想运行它在股票JDK你需要添加更多的东西到类路径。

运行 Graal.js 股票 JDK**

有一个关于如何 运行 Graal.js 股票 JDK: 的问题。 已接受的答案更详细地说明了在哪里可以找到必要的 jar 文件以使其在 Java 8.

上运行

简而言之,您需要将以下 jar 文件添加到类路径中才能真正实现 运行:

  • graal-sdk.jar - GraalVM polyglot API
  • truffle-api.jar - API 用于语言实现。
  • graaljs.jar - 这是 GraalVM 的 JavaScript Engine
  • 的实现
  • graaljs-scriptengine.jar -- 允许通过 Java 脚本引擎 API.
  • 使用 Graal.js
  • graaljs-launcher.jar
  • tregex.jar -- 正则表达式库
  • truffle-profiler.jar - Truffle 语言实现的分析器
  • chromeinspector.jar - 调试器集成
  • 启动器-common.jar

您可以在 downloaded 的 GraalVM 发行版中找到它们,两个版本都可以正常工作。

现在如果没有 Graal 编译器,Java脚本引擎的性能将不会是最佳的。 正如你自己提到的 JDK 11 附带了 Graal 编译器 的快照(不是 GraalVM,它是 GraalVM 项目的完整分布,包括 JS 引擎、LLVM 位码解释器、节点实施、JVM 等)。您可以通过以下方式启用 Graal 编译器 --XX:+UnlockExperimentalVMOptions --XX:+UseJVMCICompilerjava 命令。

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

IntelliJ 并未将 Graal SDK 中的所有 Jar 文件添加到您的类路径中。

您可以通过导航到

将 Jars 添加到 IntelliJ 中的类路径中
File > Project Structure > SDKs > Choose your Graal SDK

然后点击底部的+按钮添加Jar文件。添加 graal-sdk.jar 将解决查找 org.graalvm 包的问题。

这将避免必须修改您的 pom.xml 文件来修复 IDE 的问题。

具有以下特点:

  • IntelliJ IDEA
  • SDKMan
  • GraalVM CE 19.0.0

我通过以下步骤解决了这个问题:

  1. 在 intelliJ 中转到:文件 -> 项目结构 -> SDK
  2. 添加一个名为 GraalVM 的新 SDK(或选择一个描述性名称),然后在 JDK 主路径 select GraalVM 安装路径中 /Users/cjeronimo/.sdkman/candidates/java/19.0.0-grl

  1. 最后添加 graal-sdk.jar

同时使用 IntelliJ (2020.2) 和 GraalVM (graalvm-ce-java11-20.3.0) 我能够使以下代码工作:

public static void main(String[] a0rgs) {
    System.out.println("Hello World!");
    Context context = Context.create();
    context.eval("js", "console.log('hello from javascript');");
}

只需将此依赖项添加到 maven:

<dependency>
    <groupId>org.graalvm.sdk</groupId>
    <artifactId>graal-sdk</artifactId>
    <version>20.3.0</version>
</dependency>