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

标签 java java-8 java-11 graalvm

我正在开发一个需要执行的 Java 应用程序 JavaScript。 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 从 build 20 开始就带有 GraalVM。

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

最后,我尝试从 Maven 添加 Graal SDK 并且包被解析。现在我在运行时遇到异常:

Context ctx = Context.create(“js”);

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

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

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

最佳答案

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.Contextorg.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>

现在,当您从 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 JavaScript 引擎。

如果您想在标准 JDK 上运行它,您需要向类路径中添加更多内容。

在普通 JDK 上运行 Graal.js**

有一个关于如何在标准 JDK 上运行 Graal.js 的问题:How to use graaljs ? Is there a place where to get a .jar file/files? . 接受的答案更详细地说明了在哪里可以找到必要的 jar 文件以使其在 Java 8 上运行。

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

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

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

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

现在在 JDK 11 上运行它可能无法正常工作,因为 JDK 11 与 JDK 8 有很大不同,模块系统可能存在问题或缺少某些东西(如 jax-b),但它也可能工作。它适用于 JDK 8。

关于java - 如何让 Graal SDK 包在没有 Maven 的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156119/

相关文章:

java - .NET using-Statement 和 Java try-with-resources 之间的区别

java - 对于 Document 类型,方法 setXmlStandalone(boolean) 未定义

java - 为什么 Stream.limit 在此代码段中没有按预期工作?

java - 从遗留代码到 Java 11 的迁移问题

java - 使用 SuperCSV 更改 header 值

c# - Java 相当于 C# Stream Write() (HttpWebRequest -> HttpURLConnection)

Java:图像上的 JComboBox 选择问题

Java 8 Streams - 为什么我不能对整数流求和?

java - 使用较新版本的 Java,我的一些应用程序快捷方式被 MacOS 快捷方式覆盖

java - 从微秒创建 Java DateTime Instant