ランタイムリソースは、後方互換性のある方法で処理されます。例えば。あなたが過去に
URL url = Object.class.getResource("Object.class");
System.out.println(url);
をしたとき、あなたは通常、あなたの代わりに
jrt:/java.base/java/lang/Object.class
を与えるJavaの9の下で同じことを実行している
jar:file:/path-to-jre/lib/rt.jar!/java/lang/Object.class
のようなものを得ました。どちらの場合でも、FileSystem
を開いて、他の利用可能なリソース(Java 7以降)を調べることができます。
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の下で実行されている場合は、あなたがロードする必要があります:ZipFileSystem
はFileSystems.newFileSystem
まず、Javaの9のファイルシステムを介して作成されなければならなかったものの、すでにでも使用するために開いています適切なファイルシステムの実装では、手動で最初に、これはさえ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
を使用してデータを検査または抽出することができますが、ランタイムイメージの表現はまったくクラスファイルである必要はないため、適切な用語は「同等のクラスファイルを格納する」ことです。
「jimage」へのリンクとそれをどのように使用すると便利でしょうか。 – nullpointer
jimageのドキュメントページはありませんが、 'jimage --help'は十分なはずです。このツールは、トラブルシューティングやサポートのために含まれていますが、ほとんどの開発者が必要とするものではありません。 –
私のために働いた。ちょうど '$ jimageは$ JAVA_HOME/lib/modules'とpoofを抽出しました! – 0xbe5077ed