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

2024-04-01

我正在开发一个需要执行的Java应用程序 JavaScript。 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.graalvm.polyglot 仍然无法解析。

最后,我尝试从 Maven 添加 Graal SDK,并且包已解决。现在我在运行时遇到异常:

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

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

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

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


GraalVM

GraalVM 是目前的高性能嵌入式多语言虚拟机 支持多种编程语言:Java(和 JVM 语言)、 JavaScript(包括node.js)、Ruby、R、Python和C/C++等语言 与 LLVM 后端。

您可以在此处下载 GraalVM 的预构建发行版:https://www.graalvm.org/downloads https://www.graalvm.org/downloads。 其中包括 java 运行时、node 运行时、称为 Graal.js 的 JavaScript 引擎等。

谷歌SDK是多语言 API,允许 GraalVM 与其可以运行的所有语言实现一起使用。 这个多语言 API 打包为 jar 文件:$GRAALVM_HOME/jre/lib/boot/graal-sdk.jar.

将该文件作为外部库添加到您的 IDEA 项目/模块中,将允许 IDE 找到如下类:org.graalvm.polyglot.Context and 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>

现在当你运行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 文件? https://stackoverflow.com/questions/50738198/how-to-use-graaljs-is-there-a-place-where-to-get-a-jar-file-files。 接受的答案更详细地说明了在哪里可以找到必要的 jar 文件以使其在 Java 8 上工作。

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

  • graal-sdk.jar -GraalVM 多语言 API https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/package-summary.html
  • truffle-api.jar - 用于语言实现的 API。
  • graaljs.jar- 这是 GraalVM 的 JavaScript 引擎的实现
  • graaljs-scriptengine.jar —— 允许通过 Java 脚本引擎 API 使用 Graal.js。
  • graaljs-launcher.jar
  • tregex.jar——正则表达式库
  • truffle-profiler.jar - Truffle 语言实现的分析器
  • chromeinspector.jar - 调试器集成
  • 启动器-common.jar

您可以在您使用的 GraalVM 发行版中找到它们下载的 https://www.graalvm.org/downloads,两个版本都可以正常工作。

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

现在全部在 JDK 11 上运行might不起作用,因为 JDK 11 与 JDK 8 有很大不同,并且模块系统可能存在问题或缺少某些内容(例如 jax-b),但它也可能起作用。它可以在 JDK 8 上运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Graal SDK 包在没有 Maven 的情况下工作? 的相关文章

  • 从 java sdk 向对等方发送提案时出现访问被拒绝错误

    我正在尝试使用以下代码查询区块链并收到访问被拒绝错误 我也遇到同样的错误sendTransactionProposal方法也是如此 UserContext adminUserContext RegisterEnrollUser regist
  • Android Studio:lambda 不起作用[重复]

    这个问题在这里已经有答案了 当尝试使用 lambda 表达式时 我遇到了一些 Gradle 构建错误 错误 41 100 错误 source 1 7 不支持 lambda 表达式 使用 source 8 或更高版本来启用 lambda 表达
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐