ポリグロット・ネイティブ実行可能ファイル(JavaおよびJavaScript)のビルド
GraalVMポリグロットAPIを使用すると、Javaベースのホスト・アプリケーションにゲスト言語のコードを埋め込んで実行できます。GraalVMを使用すると、JavaScriptが埋め込まれたJavaアプリケーションを事前にコンパイルして、ポリグロット・ネイティブ実行可能ファイルを作成できます。Javaホスト・アプリケーションがJavaScriptなどのゲスト言語と対話する方法の詳細は、言語の埋込みのドキュメントを参照してください。
ノート: GraalVMネイティブ・イメージによるJavaScriptサポートは、一般提供とみなされています。
このガイドでは、Javaをホスト言語、JavaScriptをゲスト言語とするポリグロット・ネイティブ実行可能ファイルをビルドする方法を示します。
デモ部分では、単純なJSON Pretty Printer Javaアプリケーションを使用して、JSON形式で出力します:
import java.io.*;
import java.util.stream.*;
import org.graalvm.polyglot.*;
public class PrettyPrintJSON {
public static void main(String[] args) throws java.io.IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = reader.lines()
.collect(Collectors.joining(System.lineSeparator()));
try (Context context = Context.create("js")) {
Value parse = context.eval("js", "JSON.parse");
Value stringify = context.eval("js", "JSON.stringify");
Value result = stringify.execute(parse.execute(input), null, 2);
System.out.println(result.asString());
}
}
}
前提条件
GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。
- デモ・リポジトリをダウンロードまたはクローニングし、native-image/build-with-js-embedded/ディレクトリに移動します:
git clone https://github.com/graalvm/graalvm-demos
cd graalvm-demos/native-image/build-with-js-embedded
- プロジェクト構成ファイル(この場合はpom.xml)を開き、必要な依存関係を調査してJavaScriptとの相互運用性を有効にします。
- ポリグロット・ランタイムを有効にするには:
<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>${graalvm.polyglot.version}</version> </dependency>
- Javascriptを有効にするには:
<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>js</artifactId> <version>${graalvm.polyglot.version}</version> </dependency>
- ポリグロット・ランタイムを有効にするには:
- Mavenを使用してプロジェクトをコンパイルおよびパッケージ化します:
mvn clean package
- ネイティブ実行可能ファイルをビルドします:
mvn -Pnative package
実行可能ファイルをビルドするだけでなく、JavaScriptエンジンもプルするため、数分かかります。JavaScriptコンテキストは、生成されたイメージで使用できます。
ノート: ポリグロット・ネイティブ実行可能ファイルをビルドする場合、Truffleフレームワークが含まれているため、より多くの物理メモリーが必要です。
- 生成された実行可能ファイルを実行し、いくつかの整形出力を実行します:
./target/PrettyPrintJSON <<EOF {"GraalVM":{"description":"Language Abstraction Platform","supports":["combining languages","embedding languages","creating native images"],"languages": ["Java", "JavaScript", "Python"]}} EOF
予想される出力は次のとおりです。
{ "GraalVM": { "description": "Language Abstraction Platform", "supports": [ "combining languages", "embedding languages", "creating native images" ], "languages": [ "Java", "JavaScript", "Python" ] } }