如何解压缩文件 jre-9/lib/modules?

2022-09-01 15:12:36

在目录中(至少在Windows上),有一个名为“大小约为107 MB”的新文件。是否可以提取该文件或在其中列出java模块?JRE-9/libmodules

我可以看到一个名为的新工具在 ,但用于读取位于 的文件,并且无法读取文件 。jmodjdk-9/bin/jmod.exe.jmodjdk-9/jmodsmodules


答案 1

该文件是一个容器文件。它是JDK的内部,格式没有记录(它可能随时更改)。出于故障排除目的,bin 目录中的工具可用于列出或提取内容。modulesjimage


答案 2

运行时资源以向后兼容的方式进行处理。例如,当您这样做时

URL url = Object.class.getResource("Object.class");
System.out.println(url);

在过去,你通常会得到类似的东西

jar:file:/path-to-jre/lib/rt.jar!/java/lang/Object.class

在Java 9下运行相同的功能将为您提供

jrt:/java.base/java/lang/Object.class

相反。在任何一种情况下,您都可以在其上打开 以检查其他可用资源(从Java 7开始)。虽然必须首先创建,但Java 9的文件系统甚至已经开放供使用:FileSystemZipFileSystemFileSystems.newFileSystem

private static void readMyOwnJRE() throws IOException {
    try {
        Path p = Paths.get(URI.create("jrt:/")).resolve("/modules");
        System.out.println("My own JRE's modules:");
        Files.list(p).forEach(m -> System.out.println(m.getFileName()));
        System.out.println();
    } catch(FileSystemNotFoundException ex) {
        System.out.println("Could not read my modules (perhaps not Java 9?).");
    }
}

如果您在与要检查的 JRE 不同的 JRE 下运行,则必须首先手动加载相应的文件系统实现,但这为检查 Java 9 安装提供了可能性,即使从 Java 8 JRE 中也是如此:

public static void readOtherJRE(Path pathToJRE) throws IOException {
    Path p = pathToJRE.resolve("lib").resolve("jrt-fs.jar");
    if(Files.exists(p)) {
        try(URLClassLoader loader = new URLClassLoader(new URL[]{ p.toUri().toURL() });
            FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"),
                                                      Collections.emptyMap(),
                                                      loader)) {
            System.out.println("Modules of "+pathToJRE);
            Files.list(fs.getPath("/modules")).forEach(System.out::println);
            System.out.println();
        }
    }
}

一旦你有了一个文件系统(或者进入了它),你可以使用所有标准功能,例如Files来检查或提取/复制数据,尽管正确的术语是“将等效的类文件存储在不同的文件系统中”,因为运行时映像的表示根本不一定是类文件。Path


推荐