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

Eng*_*uad 15 java jdk-tools java-9 java-module jmod

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

我可以看到一个名为的新工具jmod可用jdk-9/bin/jmod.exe,但是用于读取.jmod位于的文件,jdk-9/jmods它无法读取文件modules.

Ala*_*man 18

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

  • 没有jimage的文档页面,但`jimage --help`应该足够了.请注意,该工具包含在故障排除/支持使用中,这不是大多数开发人员所需要的. (6认同)
  • 任何指向 `jimage` 的链接以及如何使用它也会很有用。 (2认同)
  • 为我工作。刚刚做了`$ jimage extract $JAVA_HOME/lib/modules`然后噗! (2认同)

Hol*_*ger 10

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

URL url = Object.class.getResource("Object.class");
System.out.println(url);
Run Code Online (Sandbox Code Playgroud)

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

jar:file:/path-to-jre/lib/rt.jar!/java/lang/Object.class
Run Code Online (Sandbox Code Playgroud)

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

jrt:/java.base/java/lang/Object.class
Run Code Online (Sandbox Code Playgroud)

代替.在任何一种情况下,您都可以打开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?).");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


And*_*ert 5

modules文件应为单个文件(并非要在任何地方提取),其中包含JDK中存在的所有模块的二进制表示形式,并且其文档格式可能会发生变化。您可以列出包含的模块java --list-modules

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


xxl*_*666 5

您可以使用

$ jimage list $JAVA_HOME/lib/modules
Run Code Online (Sandbox Code Playgroud)

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

另外,你可以使用

$ jimage extract --dir=<directory>  $JAVA_HOME/lib/modules
Run Code Online (Sandbox Code Playgroud)

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

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