我正在开发需要执行的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,但即使这样,它也会引发异常。
有经验的人可以解释这个问题吗?
答案 0 :(得分:6)
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.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>
现在,当您从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:How to use graaljs ? Is there a place where to get a .jar file/files?上运行Graal.js的问题。 接受的答案提供了更多详细信息,告诉您在哪里可以找到必要的jar文件以使其在Java 8上运行。
简而言之,您需要将以下jar文件添加到类路径以使其实际运行:
您可以在downloaded的GraalVM发行版中找到它们,两个版本都可以正常工作。
现在,如果没有Graal编译器,JavaScript引擎的性能将不是最佳的。
就像您自己提到的那样,JDK 11附带了Graal 编译器(不是GraalVM)的快照,它是GraalVM项目的完整版本,包括JS引擎,LLVM位代码解释器,节点实现,JVM等。您可以通过传递来启用Graal编译器
--XX:+UnlockExperimentalVMOptions --XX:+UseJVMCICompiler
至java
命令。
现在在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
软件包来解决此问题。
这将避免必须修改pom.xml
文件来解决IDE的问题。
答案 3 :(得分:0)
具有下一个特征:
我只需执行以下步骤即可解决此问题:
答案 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>