我在 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
这些 jars 从 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 在目录中找到所有 jars/modules,但是在尝试解析配置 jvm 时会抛出
未找到模块 org.graalvm.sdk,com.oracle.truffle.regex 需要