OpenJDK VM で Java 16 アプリケーションを実行しています。
実行時に、jar バイナリから Graal JS をロードする必要があります。
アプリケーションのスタートアップ フラグにアクセスできない、デフォルトのクラス ローダーを変更できない、Graal バイナリを jar にシェーディングできない、OpenJDK を GraalVM に変更できないことに注意してください。
https://docs.oracle.com/en/graalvm/enterprise/20/docs/reference-manual/js/RunOnJDK/によると
最小限のセットアップには、次のjarが必要です
graal-js-21.1.0.jar
graal-regex-21.1.0.jar
graal-sdk-21.1.0.jar
graal-truffle-api-21.1.0.jar
icu4j.jar
これらの jar は、maven central からローカル ファイルシステムにダウンロードされました。ここで、実行時にクラスパス内にクラスを追加する必要があります。
Java 16 より前は、URLClassloader#addUrl メソッドを使用できました。しかし、Java 16 では、エコシステムはモジュールのカプセル化に対してより厳密になり、これはもはやオプションではありません。
ModuleFinder moduleFinder = ModuleFinder.of(graalJarDir);
List<String> modules = moduleFinder
.findAll()
.stream()
.map(ModuleReference::descriptor)
.map(ModuleDescriptor::name)
.collect(Collectors.toList());
Configuration pluginsConfiguration = ModuleLayer
.boot()
.configuration()
.resolve(pluginsFinder, ModuleFinder.of(), modules);
私はJavaモジュールAPIを利用しようとしています。
ModuleFinder はディレクトリ内のすべての jar/モジュールを検出しますが、構成を解決しようとすると jvm がスローされます
モジュール org.graalvm.sdk が見つかりません。com.oracle.truffle.regex で必要です