web-dev-qa-db-ja.com

ファイルjre-9 / lib / modulesを抽出する方法は?

JRE-9/libディレクトリ(少なくともWindowsの場合)には、サイズが約107 MBのmodulesという新しいファイルがあります。そのファイルを抽出したり、Javaモジュール内のモジュールをリストしたりできますか?

jmodという新しいツールがjdk-9/bin/jmod.exeで利用できることがわかりますが、これは.jmodにあるjdk-9/jmodsファイルを読み取るためのものであり、ファイルを読み取ることができませんmodules

21
Eng.Fouad

modulesファイルはコンテナファイルです。これはJDKの内部にあり、フォーマットは文書化されていません(いつでも変更される可能性があります)。トラブルシューティングの目的で、binディレクトリのjimageツールを使用して、内容を一覧表示または抽出できます。

16
Alan Bateman

ランタイムリソースは、下位互換性のある方法で処理されます。例えば。あなたがしたとき

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以降)。最初にZipFileSystemFileSystems.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 データを検査または抽出/コピーします。ただし、ランタイムイメージの表現では、「同等のクラスファイルを別のファイルシステムに保存する」というのが正しい用語です。まったくクラスファイルである必要があります。

8
Holger

modulesファイルは、変更される可能性のある非ドキュメント形式のJDKに存在するすべてのモジュールのバイナリ表現を含む単一のファイル(どこにも抽出されることを意図したものではありません)であることを意図しています。含まれているモジュールをJava --list-modulesで一覧表示できます。

最初はmodulesファイルにすべてのモジュールが含まれ、基本的にJDKの側面が2倍になりますが、jlinkユーティリティを使用してJDKを「縮小」すると、modulesファイルが小さくなります(プログラムにJDKで提供されるモジュールのサブセットが含まれていると想定)。 jlinkの詳細については、こちらを参照してください: http://openjdk.Java.net/jeps/282

4
Andy Guibert

Java --list-modulesでモジュールをリストできます

2
ZhekaKozlov

あなたは使うことができます

$ jimage list $Java_HOME/lib/modules

「Java/io/EOFException.class」など、すべてのシステムパッケージの名前を一覧表示します。

また、あなたは使うことができます

$ jimage extract --dir=<directory>  $Java_HOME/lib/modules

指定したディレクトリにすべての.classファイルを抽出します。

参照: https://adoptopenjdk.gitbooks.io/adoptopenjdk-getting-started-kit/en/intermediate-steps/openjdk9-jimage.html

0
xxllxx666

Libjimageを使用して、このファイルを読み取ることができます。

0
Glavo