如何解压缩文件jre-9 / lib / modules?
在JRE-9/lib
目录中(至少在Windows上),有一个名为modules
的新文件,其大小约为107 MB。 是否可以提取该文件或列出其中的java模块?
我可以看到jdk-9/bin/jmod.exe
有一个名为jmod
的新工具,但是它用于读取位于jdk-9/jmods
.jmod
文件,它无法读取文件modules
。
modules
文件是容器文件。 它是JDK的内部,并且没有记录格式(它可能随时更改)。 出于故障排除目的,bin目录中的jimage
工具可用于列出或提取内容。
运行时资源以向后兼容的方式处理。 例如,当你这样做
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安装:
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
来检查或提取/复制数据,虽然正确的术语将“存储一个等效的类文件”在不同的文件系统,因为运行时图像的表示根本不必是类文件。
modules
文件意味着是单个文件(并不意味着在任何地方提取),它包含JDK中存在的所有模块的二进制表示,其格式可能会发生变化。 您可以使用java --list-modules
列出它包含java --list-modules
。
最初, modules
文件将包含每个模块,并且基本上是JDK本身的两倍,但是一旦使用jlink
实用程序“缩小”JDK, modules
文件将变得更小(假设您的程序包含所提供模块的子集)与JDK)。 有关jlink
更多信息,请访问: http : //openjdk.java.net/jeps/282
您可以通过java --list-modules
列出java --list-modules
您可以使用libjimage来读取此文件。