java - 如何让 Graal SDK 包在没有 Maven 的情况下工作?
问题描述
我正在开发一个需要执行 JavaScript 的 Java 应用程序。Nashorn JS 引擎即将被弃用,取而代之的是使用 GraalVM 的 Graal SDK 提供的一组 API。本质上执行多种语言的虚拟机。
至少我是这么认为的。所以我花了一天时间试图让它工作。我下载了使用 JDK 8 的 GraalVM rc6。我使用 IntelliJ IDEA 并将 GraalVM 添加为新的 JDK。我觉得很奇怪我应该添加一个虚拟机作为开发工具包,但我知道它是基于 JDK 8 的,所以我可以接受。
而且问题与其他问题不同,我无法让新软件包正常工作。我的 IDE 告诉我它无法解决它们。
实际上,没有一个 org.graalvm 包可以解决。
所以我下载了 JDK 11 build 28,因为据我所知,自 build 20 起 JDK 11 就带有 GraalVM。
实际上,在这种情况下,可以找到一些包,但远远少于预期:例如 org.graalvm.polyglot 仍然无法解析。
最后,我尝试从 Maven 添加 Graal SDK 并解决了这些包。现在我在运行时遇到异常:
Context ctx = Context.create(“js”);
在类路径上找不到语言和多语言实现。确保 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是允许 GraalVM 使用它可以运行的所有语言实现的多语言 API。这个多语言 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>
现在,当您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 - Truffle 语言实现的分析器
- chromeinspector.jar - 调试器集成
- 启动器-common.jar
你可以在你下载的 GraalVM 发行版中找到它们,两个版本都可以正常工作。
现在,如果没有 Graal 编译器,JavaScript 引擎的性能将不会是最佳的。正如您自己提到的,JDK 11 附带了 Graal编译器的快照(不是 GraalVM,它是 GraalVM 项目的完整发行版,包括 JS 引擎、LLVM 位码解释器、节点实现、JVM 等)。--XX:+UnlockExperimentalVMOptions --XX:+UseJVMCICompiler
您可以通过传递给java
命令来启用 Graal 编译器
。
现在在 JDK 11 上运行它可能无法正常工作,因为 JDK 11 与 JDK 8 有很大不同,并且模块系统可能存在问题或缺少某些东西(如 jax-b),但它也可能工作。它可以在 JDK 8 上运行。
推荐阅读
- c# - 为什么使用 /langversion:latest 编译时不报告 C# CS0136 错误
- swift - 将 @objc 函数作为参数传递给 init 以用作 UIControl 目标的操作
- angular - 导航链接需要点击 2 次才能响应
- sql - 如何计算 PostgreSQL 中出现连续行的总时间
- mysql - 'group by' 操作后如何获取某条记录
- java - 获取错误 java.lang.NoClassDefFoundError: org/mockito/MockitoAnnotations$Mock
- c# - 将 WPF DataGrid 导出为 CSV 时修剪值
- azure - 将内部 VNET 中的 API 管理与应用程序网关集成
- robotframework - Store Variable Of Response in RobotFramework
- php - 如何处理 php artisan queue:listen