2017-12-22 37 views
4

に非システムモジュールを列挙するためにどのように、あなたはこれらのModuleReferenceのオブジェクトは、その後使用して、各モジュールの内容を一覧表示するために使用することができJavaの9モジュールシステムでのJava 9

Set<ModuleReference> ms = ModuleFinder.ofSystem().findAll(); 

を使用してシステム・モジュールを見つけることができます。

for (ModuleReference m : ms) { 
    System.out.println(m.descriptor().name()); 
    System.out.println(" " + m.descriptor().toNameAndVersion()); 
    System.out.println(" " + m.descriptor().packages()); 
    System.out.println(" " + m.descriptor().exports()); 
    Optional<URI> location = m.location(); 
    if (location.isPresent()) { 
     System.out.println(" " + location.get()); // e.g. "jrt:/java.base" 
    } 
    m.open().list().forEach(s -> System.out.println(" " + s)); 
} 

そして、現在のクラスのモジュールを取得するには、使用することができます

Module m = getClass().getModule(); 

しかし、ModuleからModuleReferenceを得ることができないので、パッケージ以外のモジュールの内容を表示することはできません。ModuleFinderで表示されていないModuleのシステムはありません。

つの質問:

  1. 私は非システム・モジュール内のリソースを列挙する方法を教えてください。
  2. JRE 9では非モジュールクラスパスはどのように読み込まれますか?私はちょうどjava.class.pathシステムプロパティに頼っていますか? (タイプURLClassPathAppClassLoader#ucpフィールドが表示されていない、とJRE 9にロックダウンされているので、あなたは、どちらかのイントロスペクションによってそれを得ることができません。)
+2

質問のハイライト部分はモジュールのURI(場所/パス)を取得することでしょうか?私はあなたが非システムモジュールについて悩まされていると思います、それは本当ですか?あなたのコードの他のすべての属性はModuleDescriptor([Moduleのエンティティ])(https://docs.oracle.com/javase/9​​/docs/api/java/lang/Module.html#getDescriptor- - )それ自体。またAFAIRこれはおそらく同様の質問と重複する可能性があります。あなたが詳細を確認するのを待つでしょう。 – nullpointer

+2

問題の詳細は表示されません。(モジュールの[ModuleLayer](https://docs.oracle.com/javase/9​​/docs/api/)に興味があるかもしれません。 java/lang/Module.html#getLayer--)。そこにあるリンクの例を見ると、ModuleFinder経由でモジュールのディレクトリを使って設定とレイヤーを見つけることができます。 – nullpointer

答えて

4

これはどう:

Set<String> systemModuleNames = ModuleFinder 
     .ofSystem() 
     .findAll() 
     .stream() 
     .map(moduleRef -> moduleRef.descriptor().name()) 
     .collect(Collectors.toSet()); 

List<Module> nonSystemModules = ModuleLayer 
     .boot() 
     .modules() 
     .stream() 
     .filter(m -> !systemModuleNames.contains(m.getName())) 
     .collect(Collectors.toList()); 

System.out.println(nonSystemModules); 

今ときあなたはnonSystemModulesを持っています。あなたはこのリストで望みどおりのことをすることができます(例えば各モジュールのリソースを取得するなど)。

+2

ありがとう@ZhekaKozlov。これは残念なことに自動(無名)モジュールでは機能しません。これは、私が扱う必要があることが判明しています(具体的には、自動モジュールは 'ModuleLayer.boot()。modules()'によって返されません)。あなたは自動モジュールのリストを取得する方法を知っていますか? Re。質問(2):私が言及しているのは、非モジュールクラスファイルをJava 9のクラスパスに追加する機能です。これらは常に自動モジュールに変換されますか?私は、JREが 'java.class.path'と' -cp'スイッチを引き続き尊重していると読んでいると思います。 コンテキストのために、私が達成しようとしているのはクラスパススキャンです。 –

関連する問題