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

时间:2018-09-03 20:55:52

标签: 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内部版本28,因为据我所知,自版本20开始,JDK 11随GraalVM一起提供。

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

最后,我尝试从Maven添加Graal SDK并解决了软件包。现在运行时出现异常:

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

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

我认为前两个案例中的问题实际上不是获取GraalVM JDK,但即使这样,它也会引发异常。

有经验的人可以解释这个问题吗?

5 个答案:

答案 0 :(得分:6)

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可以使用它可以运行的所有语言实现。 该polyglot 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:How to use graaljs ? Is there a place where to get a .jar file/files?上运行Graal.js的问题。 接受的答案提供了更多详细信息,告诉您在哪里可以找到必要的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-松露语言实现的探查器
  • chromeinspector.jar-调试器集成
  • launcher-common.jar

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

现在,如果没有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上运行。

答案 1 :(得分:2)

所以我发现了问题所在。 IntelliJ IDEA非常习惯 没有加载的标准JDK Home结构 Graal SDK和其他API。

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

答案 2 :(得分:1)

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

您可以通过导航到

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

然后单击底部的+按钮以添加Jar文件。添加graal-sdk.jar将通过找到org.graalvm软件包来解决此问题。

Add graal-sdk.jar

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

答案 3 :(得分:0)

具有下一个特征:

  • IntelliJ IDEA
  • SDKMan
  • GraalVM CE 19.0.0

我只需执行以下步骤即可解决此问题:

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

enter image description here

  1. 最后重要的是添加graal-sdk.jar

enter image description here

答案 4 :(得分:0)

同时使用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>