在JRE-9/lib
目錄(至少在Windows上),有一個名爲modules
的新文件,其大小約爲107 MB。是否有可能提取該文件或可能列出其中的Java模塊?如何提取文件jre-9/lib/modules?
我可以看到一個新的工具,稱爲jmod
可在jdk-9/bin/jmod.exe
,但這是用於讀取位於jdk-9/jmods
.jmod
文件,它無法讀取該文件modules
。
在JRE-9/lib
目錄(至少在Windows上),有一個名爲modules
的新文件,其大小約爲107 MB。是否有可能提取該文件或可能列出其中的Java模塊?如何提取文件jre-9/lib/modules?
我可以看到一個新的工具,稱爲jmod
可在jdk-9/bin/jmod.exe
,但這是用於讀取位於jdk-9/jmods
.jmod
文件,它無法讀取該文件modules
。
modules
文件是一個容器文件。它在JDK內部,格式沒有記錄(可能隨時更改)。出於故障排除的目的,bin目錄中的jimage
工具可用於列出或提取內容。
可以經由java --list-modules
的modules
文件意味着是單個文件(並不意味着任何地方提取的)列出模塊,其包含在一個undocument格式的所有存在於JDK模塊的二進制表示這可能會發生變化。您可以使用java --list-modules
列出它包含的模塊。
最初modules
文件將包含每一個模塊,基本上翻倍的JDK自身的一面,但一旦你使用jlink
工具「再壓縮」你的JDK,在modules
文件將變得更小(假設你的程序中包含一個子集隨JDK一起提供的模塊)。欲瞭解更多有關jlink
的信息,請參閱:http://openjdk.java.net/jeps/282
運行時資源以向後兼容的方式處理。例如。當你過去那樣
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
第一,爪哇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不是要檢查一個運行時,你必須加載相應的文件系統實現手動第一,但這個開放,甚至從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
進去),Y您可以使用所有標準功能,例如Files
檢查或提取/複製數據,雖然正確的術語是「將等同的類文件」存儲在不同的文件系統中,因爲運行時映像的表示根本不必是類文件。
您可以使用jdk.internal.jimage.ImageReader來讀取此文件。
「jimage」的任何鏈接以及如何使用它都很有用。 – nullpointer
jimage沒有文檔頁面,但'jimage --help'應該有足夠的空間。請注意,該工具包含在故障排除/支持用途中,這不是大多數開發人員所需要的。 –
爲我工作。只是做了'$ jimage提取$ JAVA_HOME/lib/modules'和poof! – 0xbe5077ed