2017-09-27 1 views
8

JRE-9/libディレクトリには(少なくともWindowsでは)modulesという新しいファイルがあり、そのサイズは約107 MBです。そのファイルを解凍したり、その中にJavaモジュールをリストすることは可能ですか?jre-9/lib/modulesファイルの解凍方法は?

私はjmodと呼ばれる新しいツールがjdk-9/bin/jmod.exeで利用可能であるが、それはjdk-9/jmodsに位置しており、それがファイルmodulesを読み取ることができません.jmodファイルを読み込むためのものであることを見ることができます。

undocument形式でJDKに存在するすべてのモジュールのバイナリ表現を含む

答えて

6

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

+1

「jimage」へのリンクとそれをどのように使用すると便利でしょうか。 – nullpointer

+4

jimageのドキュメントページはありませんが、 'jimage --help'は十分なはずです。このツールは、トラブルシューティングやサポートのために含まれていますが、ほとんどの開発者が必要とするものではありません。 –

+0

私のために働いた。ちょうど '$ jimageは$ JAVA_HOME/lib/modules'とpoofを抽出しました! – 0xbe5077ed

1

あなたはmodulesファイルが単一のファイルであることを意味するjava --list-modules

3

(どこでも取り出すことを意図していない)を介してモジュールを一覧表示することができ変更される可能性があります。含まれているモジュールをjava --list-modulesと表示することができます。

当初modulesファイルは、すべてのモジュールと、独自のJDKの基本的に二重の側面が含まれていますが、あなたはjlinkユーティリティを使用してJDKを「縮小化」と、modulesファイルが小さくなります(あなたのプログラムを仮定すると、サブセットが含まれていますJDKに付属しているモジュールの一覧)。 jlinkの詳細についてはこちらをご覧ください:http://openjdk.java.net/jeps/282

3

ランタイムリソースは、後方互換性のある方法で処理されます。例えば。あなたが過去に

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の下で実行されている場合は、あなたがロードする必要があります:ZipFileSystemFileSystems.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を使用してデータを検査または抽出することができますが、ランタイムイメージの表現はまったくクラスファイルである必要はないため、適切な用語は「同等のクラスファイルを格納する」ことです。

0

jdk.internal.jimage.ImageReaderを使用してこのファイルを読み取ることができます。

関連する問題