JRE-9/lib
ディレクトリ(少なくともWindowsの場合)には、サイズが約107 MBのmodules
という新しいファイルがあります。そのファイルを抽出したり、Javaモジュール内のモジュールをリストしたりできますか?
jmod
という新しいツールがjdk-9/bin/jmod.exe
で利用できることがわかりますが、これは.jmod
にあるjdk-9/jmods
ファイルを読み取るためのものであり、ファイルを読み取ることができません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
で一覧表示できます。
最初はmodules
ファイルにすべてのモジュールが含まれ、基本的にJDKの側面が2倍になりますが、jlink
ユーティリティを使用してJDKを「縮小」すると、modules
ファイルが小さくなります(プログラムにJDKで提供されるモジュールのサブセットが含まれていると想定)。 jlink
の詳細については、こちらを参照してください: http://openjdk.Java.net/jeps/282
Java --list-modules
でモジュールをリストできます
あなたは使うことができます
$ jimage list $Java_HOME/lib/modules
「Java/io/EOFException.class」など、すべてのシステムパッケージの名前を一覧表示します。
また、あなたは使うことができます
$ jimage extract --dir=<directory> $Java_HOME/lib/modules
指定したディレクトリにすべての.classファイルを抽出します。
Libjimageを使用して、このファイルを読み取ることができます。