0

我在 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 需要

4

0 回答 0