如何从另一个JRT读取课程?

从 Java 11 开始,如何读取另一个运行时映像的内容?

为了列出 Java 运行时映像的内容,JEP 220建议了以下解决方案:

URL 方案的内置 NIOFileSystem提供程序jrt确保开发工具可以通过加载FileSystemURL 命名的来枚举和读取运行时映像中的类和资源文件jrt:/,如下所示:

FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
byte[] jlo = Files.readAllBytes(fs.getPath("modules", "java.base",
                                           "java/lang/Object.class"));

此代码段有效,并允许我读取java/lang/Object.class正在执行代码的 Java 安装的运行时映像中的内容。

java/lang/Object.class考虑到它的 java home,我怎样才能让它读取另一个 Java 安装中的内容?

我已经阅读了这个 SO answer,它解释了如何从 Java 8 运行时读取 Java 运行时图像的内容。不幸的是,这不适用于较新的 Java 运行时,因为我相信 for 的文件系统jrt:/将始终指向当前的运行时映像。

回答

您仍然可以使用本答案中jrt:/描述的方案,您只需要在创建对象时在环境参数中提供替代路径:java.homeFileSystem

public static void listModules(String javaHome) throws IOException {
    FileSystem fs = FileSystems.newFileSystem(
            URI.create("jrt:/"),
            Collections.singletonMap("java.home", javaHome));
    try (Stream<Path> stream = Files.list(fs.getPath("/modules"))) {
        stream.forEach(System.out::println);
    }
}

或者,读取单个资源:

public static byte[] readResource(String javaHome, String module, String path) throws IOException {
    FileSystem fs = FileSystems.newFileSystem(
            URI.create("jrt:/"),
            Collections.singletonMap("java.home", javaHome));
    return Files.readAllBytes(fs.getPath("modules", module, path));
}


以上是如何从另一个JRT读取课程?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>