首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使Graal包在没有Maven的情况下工作?

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

Stack Overflow用户
提问于 2018-09-03 20:55:51
回答 5查看 4.2K关注 0票数 10

我正在开发一个需要执行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,并且解决了这些包。现在,我在运行时得到了一个异常:

代码语言:javascript
复制
Context ctx = Context.create(“js”);

在类路径上没有语言和多个标记的实现。确保松露-api.jar在类路径上。

我认为前两种情况下的问题实际上是没有获得GraalVM JDK,但即使是这样也会抛出异常。

有经验的人能解释这件事吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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.Valueorg.graalvm.polyglot.Value

如果您的项目正在使用Maven,您可以在该文件上添加一个系统依赖项,并且maven将在$JAVA_HOME设置为指向GraalVM发行版的任何系统上找到它。

代码语言:javascript
复制
<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中运行类似于以下内容并不需要更多的东西:

代码语言:javascript
复制
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聚GraalVM
  • 用于语言实现的松露api.jar- API。
  • graaljs.jar --这是GraalVM的JavaScript引擎的实现
  • graaljs -- scriptengine.jar--允许通过Java引擎API使用Graal.js。
  • graaljs-launcher.jar
  • tregex.jar -- regexp库
  • 松露-Proiler.jar-用于特松露语言实现的分析器
  • chromeinspector.jar -调试器集成
  • launcher-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上工作。

票数 11
EN

Stack Overflow用户

发布于 2018-09-03 22:23:50

所以我发现了问题。IntelliJ IDEA非常习惯于标准的JDK结构,因此它没有加载Graal和其他apis。

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

票数 2
EN

Stack Overflow用户

发布于 2018-10-18 13:14:04

IntelliJ并没有将Graal中的所有Jars添加到类路径中。

可以将Jars添加到IntelliJ中的类路径中,方法是导航到

代码语言:javascript
复制
File > Project Structure > SDKs > Choose your Graal SDK

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

这将避免修改pom.xml文件来修复IDE的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52156119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档