我正在开发一个需要执行JavaScript的Java应用程序。Nashorn引擎即将被废弃,取而代之的是使用GraalVM的GraalVM提供的一组API。本质上执行多种语言的虚拟机。
至少我是这么想的。所以我花了一天的时间试着让它起作用。我下载了使用JDK 8的GraalVM rc6,使用了IntelliJ IDEA,并添加了GraalVM作为新的JDK。我觉得奇怪的是,我应该添加一个虚拟机作为开发工具包,但我知道它是基于JDK 8的,所以我对它很满意。
而问题是不像其他人,我无法使新的软件包工作。我的IDE告诉我它不能解决这些问题。
实际上,没有一个org.graalvm包能够被解析。
所以我下载了JDK11Build28,因为据我所知,JDK 11从构建20开始就带有GraalVM。
实际上,在这种情况下,可以找到一些包,但比预期的要少得多:例如,org.graalvm.polyglot仍然无法解决。
最后,我尝试从Maven中添加Graal,并且解决了这些包。现在,我在运行时得到了一个异常:
Context ctx = Context.create(“js”);
在类路径上没有语言和多个标记的实现。确保松露-api.jar在类路径上。
我认为前两种情况下的问题实际上是没有获得GraalVM JDK,但即使是这样也会抛出异常。
有经验的人能解释这件事吗?
发布于 2018-09-06 09:17:36
GraalVM
GraalVM是一种高性能的可嵌入多标记虚拟机,目前支持多种编程语言: Java (和JVM语言)、JavaScript (包括node.js)、Ruby、Python和C/C++以及其他带有LLVM后端的语言。
您可以在这里下载GraalVM的预构建发行版:https://www.graalvm.org/downloads。除其他外,它还包括java运行时、节点运行时、名为Graal.js的Graal.js引擎等。
Graal 是允许GraalVM与它可以运行的所有语言实现一起工作的polyglot。这个polyglot API被打包为一个jar文件:$GRAALVM_HOME/jre/lib/boot/graal-sdk.jar
。
将该文件作为外部库添加到IDEA项目/模块中,将允许IDE找到与语言(包括org.graalvm.polyglot.Context
实现)进行互操作所必需的类:org.graalvm.polyglot.Value
和org.graalvm.polyglot.Value
。
如果您的项目正在使用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文件添加到类路径中,以使其实际运行:
您可以在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上工作。
发布于 2018-09-03 22:23:50
所以我发现了问题。IntelliJ IDEA非常习惯于标准的JDK结构,因此它没有加载Graal和其他apis。
使我更接近结果的Maven jar文件与GraalVM捆绑的文件完全相同。
发布于 2018-10-18 13:14:04
IntelliJ并没有将Graal中的所有Jars添加到类路径中。
可以将Jars添加到IntelliJ中的类路径中,方法是导航到
File > Project Structure > SDKs > Choose your Graal SDK
然后单击底部的+
按钮以添加Jar文件。添加graal-sdk.jar将解决查找org.graalvm
包的问题。
这将避免修改pom.xml
文件来修复IDE的问题。
https://stackoverflow.com/questions/52156119
复制相似问题