首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提取jre-9/lib/模块文件?

如何提取jre-9/lib/模块文件?
EN

Stack Overflow用户
提问于 2017-09-27 02:28:16
回答 6查看 8.7K关注 0票数 27

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-09-27 06:38:07

modules文件是一个容器文件。它是JDK内部的,格式没有文档化(它可能在任何时候都会改变)。为了进行故障排除,可以使用bin目录中的jimage工具列出或提取内容。

票数 30
EN

Stack Overflow用户

发布于 2017-09-27 15:37:36

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

代码语言:javascript
复制
URL url = Object.class.getResource("Object.class");
System.out.println(url);

在过去,你通常会遇到这样的情况

代码语言:javascript
复制
jar:file:/path-to-jre/lib/rt.jar!/java/lang/Object.class

在Java 9下运行相同的代码将为您提供

代码语言:javascript
复制
jrt:/java.base/java/lang/Object.class

而不是。在这两种情况下,您都可以在其上打开一个FileSystem来检查其他可用的资源(因为Java 7)。虽然ZipFileSystem必须首先通过FileSystems.newFileSystem创建,但JavaAversion9的文件系统甚至已经开放供使用:

代码语言:javascript
复制
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 are 9安装的可能性,即使是从Java 8 JRE:

代码语言:javascript
复制
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的所有标准函数来检查或提取/复制数据,尽管正确的术语是“在不同的文件系统中存储等效的类文件”,因为运行时映像的表示形式根本不必是类文件。

票数 20
EN

Stack Overflow用户

发布于 2017-09-27 02:50:32

modules文件应该是一个单独的文件(而不是在任何地方提取),该文件包含JDK中所有模块的二进制表示形式,格式为非文档格式,可能会更改。您可以用java --list-modules列出它包含的模块。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46438557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档