Как заставить пакеты Graal SDK работать без Maven?

Я разрабатываю приложение Java, которое должно выполнять JavaScript. Движок Nashorn JS скоро станет устаревшим, и его замена - это набор API, предоставляемый Graal SDK, который использует GraalVM. Виртуальная машина, которая по существу выполняет несколько языков.

По крайней мере, я так думаю. Таким образом, я провел день, пытаясь заставить это работать. Я скачал GraalVM rc6, который использует JDK 8. Я использую IntelliJ IDEA и добавил GraalVM в качестве нового JDK. Мне показалось странным, что я должен добавить виртуальную машину в качестве комплекта разработки, но я знал, что она основана на JDK 8, поэтому я был в порядке.

И проблема была в отличие от других, я не мог заставить работать новые пакеты. Моя IDE сказала мне, что не может их решить.

На самом деле ни один из пакетов org.graalvm не может быть разрешен.

Поэтому я скачал JDK 11, сборка 28, потому что, насколько я знаю, JDK 11 поставляется с GraalVM начиная с сборки 20.

На самом деле, в этом случае некоторые пакеты могут быть найдены, но гораздо меньше, чем ожидалось: например, org.graalvm.polyglot все еще не может быть разрешен.

Наконец, я попытался добавить Graal SDK от Maven, и пакеты были решены. Теперь я получаю исключение при запуске:

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

На пути к классам не было найдено ни языка, ни реализации полиглота. Убедитесь, что трюфель-api.jar находится на пути к классам.

Я думал, что проблема в первых двух случаях на самом деле не заключалась в приобретении GraalVM JDK, но это исключение даже в этом случае.

Может кто-нибудь опытный объяснить это дело?

6 ответов

Решение

GraalVM

GraalVM - это высокопроизводительная встраиваемая виртуальная машина с полиглотом, в настоящее время поддерживающая ряд языков программирования: Java (и языки JVM), JavaScript (включая node.js), Ruby, R, Python и C/C++ и другие языки с бэкэндом LLVM,

Вы можете скачать готовый дистрибутив GraalVM здесь: https://www.graalvm.org/downloads. Среди прочего он включает в себя среду выполнения Java, среду узла, механизм JavaScript под названием Graal.js и т. Д.

Graal SDK - это API-интерфейс polyglot, позволяющий GraalVM работать со всеми языковыми реализациями, которые он может запустить. Этот API-интерфейс polyglot упакован в файл 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>

Теперь, когда вы будете запускать 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 по умолчанию включен JavaScript-движок Graal.js.

Если вы хотите запустить его на стандартном JDK, вам нужно добавить больше вещей в classpath.

Запуск Graal.js на складе JDK**

Есть вопрос о том, как запустить Graal.js на складе. JDK: Как использовать graaljs? Есть ли место, где взять файл / файлы.jar?, В принятом ответе более подробно рассказывается, где найти необходимые файлы jar, чтобы он работал на Java 8.

В двух словах вам нужно добавить следующие jar-файлы в classpath, чтобы он действительно работал:

  • graal-sdk.jar - API полиглота GraalVM
  • truffle-api.jar - API для языковых реализаций.
  • graaljs.jar- это реализация JavaScript движка GraalVM
  • graaljs-scriptengine.jar - позволяет использовать Graal.js через API механизма сценариев Java.
  • graaljs-launcher.jar
  • tregex.jar - библиотека регулярных выражений
  • truffle-profiler.jar - профилировщик для реализаций трюфельных языков
  • chromeinspector.jar - интеграция отладчика
  • пусковая-common.jar

Вы можете найти их в загруженном дистрибутиве GraalVM, оба выпуска будут работать нормально.

Теперь без компилятора Graal производительность движка JavaScript не была бы оптимальной. Как вы уже упоминали, JDK 11 поставляется с снимком компилятора Graal (не GraalVM, который является полным распространением проекта GraalVM, включая JS enginer, интерпретатор битового кода LLVM, реализацию узла, JVM и т. Д.). Вы можете включить компилятор Graal, передав--XX:+UnlockExperimentalVMOptions --XX:+UseJVMCICompiler к java команда.

Теперь запуск всего этого на JDK 11 может не работать, потому что JDK 11 достаточно отличается от JDK 8 и могут быть проблемы с модульной системой или отсутствующими вещами (например, jax-b), но это также может работать. Это будет работать на JDK 8.

Итак, я выяснил проблему. IntelliJ IDEA настолько широко используется в стандартной структуре JDK Home, что не загружал Graal SDK и другие API-интерфейсы.

Jav-файлы Maven, которые приблизили меня к результату, были точно такими же файлами, которые были в комплекте с GraalVM.

Используя как 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>

IntelliJ не добавляет все банки из Graal SDK в ваш путь к классам.

Вы можете добавить банки в ваш путь к классам внутри IntelliJ, перейдя в

File > Project Structure > SDKs > Choose your Graal SDK

Затем нажмите + кнопка внизу, чтобы добавить файлы Jar. Добавление graal-sdk.jar решит проблему с поиском org.graalvm пакет.

Добавить graal-sdk.jar

Это позволит избежать изменения вашего pom.xml файл, чтобы исправить проблему с IDE.

Так же, как актуальный ответ, который работает в 2023 году с Gradle и без необходимости использования самого GraalVM, но в стандартном OpenJDK.

я просто добавил

      dependencies {
  implementation 'org.graalvm.sdk:graal-sdk:22.3.0'
  implementation 'org.graalvm.js:js:22.3.0'
  implementation 'org.graalvm.js:js-scriptengine:22.3.0'
}

моемуи это без проблем работает в OpenJDK.

Со следующими характеристиками:

  • IntelliJ IDEA
  • SDKMan
  • GraalVM CE 19.0.0

Я решил это только с помощью следующих шагов:

  1. В intelliJ перейдите в: Файл -> Структура проекта -> SDK
  2. Добавьте новый SDK с именем GraalVM (или выберите описательное имя), затем в домашнем пути JDK выберите путь установки GraalVM в моем случае /Users/cjeronimo/.sdkman/candidates/java/19.0.0-grl

  1. Наконец, что очень важно, добавьте graal-sdk.jar

Другие вопросы по тегам