当前位置: 首页 > 知识库问答 >
问题:

如何让GraalSDK软件包在没有Maven的情况下工作?

井斌斌
2023-03-14

我正在开发一个需要执行JavaScript的Java应用程序。Nashorn JS引擎即将被弃用,取而代之的是Graal SDK提供的一组API,它利用了GraalVM。基本上执行多种语言的虚拟机。

至少我是这么想的。所以我花了一天时间试图让它工作。我下载了使用JDK 8的GraalVM rc6。我使用IntelliJ IDEA并将GraalVM添加为新的JDK。我发现我应该添加虚拟机作为开发工具包很奇怪,但我知道它是基于JDK 8的,所以我没意见。

问题与其他问题不同,我无法让新包工作。我的IDE告诉我它无法解决它们。

实际上,org.graalvm包都无法解决。

所以我下载了JDK 11 build 28,因为据我所知,JDK 11从build 20开始就附带了GraalVM。

实际上,在本例中,可以找到一些包,但远低于预期:例如org。格拉尔文。一夫多妻制仍然无法解决。

最后,我尝试从Maven添加Graal SDK,并解决了这些包。现在我在运行时遇到一个异常:

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

在类路径上找不到语言和多语言实现。确保松露api。jar在类路径上。

我认为前2种情况下的问题实际上不是获取GraalVM JDK,但它甚至以这种方式抛出异常。

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

共有3个答案

欧阳俊明
2023-03-14

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

您可以通过导航到将Jars添加到IntelliJ中的类路径

File > Project Structure > SDKs > Choose your Graal SDK

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

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

魏宏邈
2023-03-14

所以我发现了问题。IntelliJ IDEA非常习惯于标准的JDK Home结构,以至于它没有加载GraalSDK和其他api。

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

纪佐
2023-03-14

GraalVM是一种高性能的可嵌入多语言虚拟机,目前支持多种编程语言:Java(和JVM语言)、JavaScript(包括node.js)、Ruby、R、Python和C/C以及其他LLVM后端语言。

您可以在此处下载GraalVM的预构建发行版:https://www.graalvm.org/downloads.除此之外,它还包括一个java运行时、一个节点运行时、一个名为Graal的JavaScript引擎。js等等。

Graal SDK是polyglot API,允许GraalVM与它可以运行的所有语言实现一起工作。此polyglot API打包为jar文件:$GRAALVM_HOME/jre/lib/boot/graal sdk。jar

将该文件作为外部库添加到IDEA项目/模块中,将允许IDE找到如下类:org。格拉尔文。通晓多种语言。上下文和组织。格拉尔文。通晓多种语言。值,这是与语言(包括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.jsJavaScript引擎。

如果你想在一个普通的JDK上运行它,你需要在类路径中添加更多的东西。

有一个关于如何管理Graal的问题。JDK股票上的js:如何使用graaljs?有没有地方可以买到汽车。jar文件/文件?。公认的答案更详细地说明了在哪里可以找到必要的jar文件,以使其在Java8上工作。

简而言之,您需要将以下jar文件添加到类路径以使其实际运行:

  • 格拉尔。jar-GraalVM polyglot API
  • 松露原料药。jar——用于语言实现的API
  • 格拉尔斯。jar——这是GraalVM的JavaScript引擎的实现
  • graaljs脚本引擎。jar——允许使用Graal。js通过Java脚本引擎API
  • graaljs发射器。罐子
  • 特雷克斯。jar——regexp库
  • 松露分析器。jar-用于Truffle语言实现的分析器
  • 铬检测器。jar-调试器集成
  • 发射装置通用。罐子

你可以在下载的GraalVM发行版中找到它们,两个版本都可以。

现在,如果没有Graal编译器,JavaScript引擎的性能将不会达到最佳。正如您所提到的,JDK 11附带了Graal编译器的快照(不是GraalVM,它是GraalVM项目的完整发行版,包括JS引擎、LLVM位码解释器、节点实现、JVM等)。您可以通过将--XX:UnlockExperimentalVMOptions--XX:UseJVMCompiler传递到java命令来启用Graal编译器。

现在在JDK 11上运行这一切可能不起作用,因为JDK 11与JDK 8有很大的不同,模块系统可能存在问题,或者缺少一些东西(比如jax-b),但它也可能起作用。它可以在JDK 8上运行。

 类似资料:
  • 问题内容: 我正在使用/ /在Mac OS X上进行一些研究计算。为了提高性能,我们从大学租了一个400节点的集群(使用Linux),以便可以并行完成任务。问题是我们不允许在集群上安装任何额外的软件包(否或任何安装工具),它们仅提供原始python本身。 然后如何在群集上运行脚本?有没有办法集成模块(我认为numpy和scipy也具有一些已编译的二进制文件),以便可以在不安装软件包的情况下进行解释

  • 问题内容: 我怎么能包括为没有MANIFEST.in文件? 我的setup.py看起来像这样: 版本: 我就是无法加入。 还是此博客文章仍然正确? http://blog.codekills.net/2011/07/15/lies,-more-lies-and-python-packaging- documentation-on– package_data-/ 不过,在过去的一个小时中,我了解到这

  • 问题内容: 我正在使用这个名为Viper的配置库 在我的主要我有: 然后,我有了一个以毒蛇为参数的结构: 在我的主目录中,我有一个返回该MyConfig的函数,例如: 我收到此错误: 不知道该怎么办? 问题答案: 当您导入像 包名称(在这种情况下)将作为新标识符提供给您。您可以使用此标识符来构造合格的标识符,以引用包的导出标识符(以大写字母开头的标识符)。 程序包名称本身不能使用。出现错误的行:

  • 我正在尝试安装一个没有依赖项的python模块。 我跑: 但是这个安装依赖项,任何想法怎么能做到这一点?

  • 我使用了,但对于当前的问题,它没有帮助。我希望能够创建特定于项目的包: 我尝试了多种方法,但如何获得

  • 问题内容: 在C#中,我们有和有或没有命名空间(包在Java世界中)得到一个类型(类在这种情况下)的名称。 java等于什么? 显然,有比手动使用和删除软件包名称更好的方法。 问题答案: 返回源代码中给定的基础类的简单名称。如果基础类是匿名的,则返回一个空字符串。 数组的简单名称是组件类型的简单名称,后接“ []”。特别是其组件类型为匿名的数组的简单名称为“ []”。 它实际上是从名称中删除软件包