Как заставить пакеты 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
пакет.
Это позволит избежать изменения вашего 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'
}
моему
Со следующими характеристиками:
- IntelliJ IDEA
- SDKMan
- GraalVM CE 19.0.0
Я решил это только с помощью следующих шагов:
- В intelliJ перейдите в: Файл -> Структура проекта -> SDK
- Добавьте новый SDK с именем GraalVM (или выберите описательное имя), затем в домашнем пути JDK выберите путь установки GraalVM в моем случае /Users/cjeronimo/.sdkman/candidates/java/19.0.0-grl
- Наконец, что очень важно, добавьте graal-sdk.jar