ポリグロット・ネイティブ実行可能ファイル(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!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。

  1. デモ・リポジトリをダウンロードまたはクローニングし、native-image/build-with-js-embedded/ディレクトリに移動します:
     git clone https://github.com/graalvm/graalvm-demos
    
     cd graalvm-demos/native-image/build-with-js-embedded
    
  2. プロジェクト構成ファイル(この場合は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>
      
  3. Mavenを使用してプロジェクトをコンパイルおよびパッケージ化します:
     mvn clean package
    
  4. ネイティブ実行可能ファイルをビルドします:
     mvn -Pnative package
    

    実行可能ファイルをビルドするだけでなく、JavaScriptエンジンもプルするため、数分かかります。JavaScriptコンテキストは、生成されたイメージで使用できます。

    ノート: ポリグロット・ネイティブ実行可能ファイルをビルドする場合、Truffleフレームワークが含まれているため、より多くの物理メモリーが必要です。

  5. 生成された実行可能ファイルを実行し、いくつかの整形出力を実行します:
     ./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"
         ]
       }
     }