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

时间:2017-09-27 02:28:16

标签: java java-9 java-module jdk-tools jmod

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

我可以看到jmod提供了一个名为jdk-9/bin/jmod.exe的新工具,但这是用于读取位于.jmod的{​​{1}}个文件但无法读取档案jdk-9/jmods

6 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:6)

以向后兼容的方式处理运行时资源。例如。当你做的时候

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

代替。在任何一种情况下,您都可以在其上打开FileSystem以检查其他可用资源(自Java 7起)。虽然必须首先通过ZipFileSystem创建FileSystems.newFileSystem,但Java 9的文件系统甚至已经开放使用:

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

如果您在与要检查的JRE不同的JRE下运行,则必须首先手动加载相应的文件系统实现,但这样就可以从Java 8 JRE检查Java 9安装:< / p>

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();
        }
    }
}

一旦你有了一个文件系统(或Path),就可以使用所有的标准功能,例如: Files检查或提取/复制数据,虽然正确的术语是“在不同的文件系统中存储一个等效的类文件”,因为运行时图像的表示根本不必是一个类文件

答案 2 :(得分:4)

modules文件应该是一个单独的文件(不是要在任何地方提取),它包含JDK中存在的所有模块的二进制表示,其格式可能会发生变化。您可以使用java --list-modules列出其包含的模块。

最初,modules文件将包含每个模块,并且基本上是JDK的一面,但是一旦使用jlink实用程序“缩小”JDK,modules文件将变小(假设您的程序包含JDK提供的模块的子集)。有关jlink的更多信息,请参阅此处:http://openjdk.java.net/jeps/282

答案 3 :(得分:2)

您可以通过java --list-modules

列出模块

答案 4 :(得分:1)

您可以使用

$ jimage list $JAVA_HOME/lib/modules

列出所有系统软件包的名称,例如“ java / io / EOFException.class”等。

也可以使用

$ jimage extract --dir=<directory>  $JAVA_HOME/lib/modules

将所有.class文件提取到指定目录中。

参考:https://adoptopenjdk.gitbooks.io/adoptopenjdk-getting-started-kit/en/intermediate-steps/openjdk9-jimage.html

答案 5 :(得分:0)

您可以使用libjimage读取此文件。