代码之家  ›  专栏  ›  技术社区  ›  Eng.Fouad

如何提取文件jre-9/lib/modules?

  •  27
  • Eng.Fouad  · 技术社区  · 7 年前

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

    我可以看到一个叫做 jmod 可从以下网址获得: jdk-9/bin/jmod.exe ,但那是为了阅读 .jmod 文件位于 jdk-9/jmods 模块 .

    6 回复  |  直到 7 年前
        1
  •  29
  •   Alan Bateman    7 年前

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

        2
  •  19
  •   Holger    3 年前

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

    在过去,你通常会得到

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

    在Java9下运行同样的程序将为您提供

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

    相反在任何一种情况下,您都可以打开 FileSystem 检查其他可用资源(自Java7)。而 ZipFileSystem 必须通过创建 FileSystems.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不同,则必须首先手动加载相应的文件系统实现,但这为检查Java9安装提供了可能性,即使是从Java8 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();
            }
        }
    }
    

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

        3
  •  7
  •   Andy Guibert    7 年前

    这个 modules 文件是指单个文件(不意味着在任何地方提取),其中包含JDK中所有模块的二进制表示,格式为非文档格式,可能会发生更改。您可以列出它包含的模块 java --list-modules .

    模块 文件将包含每个模块,基本上是JDK本身的两倍,但一旦您使用 jlink 模块 文件将变小(假设您的程序包含JDK提供的模块子集)。有关的更多信息 jlink公司 请参见此处: http://openjdk.java.net/jeps/282

        4
  •  4
  •   xxllxx666    4 年前

    您可以使用

    $ jimage list $JAVA_HOME/lib/modules
    

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

    此外,您可以使用

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

    提取所有。将文件分类到指定目录中。

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

        5
  •  3
  •   ZhekaKozlov    7 年前

    您可以通过以下方式列出模块: java --list-modules

        6
  •  0
  •   Glavo    6 年前