2017-01-30 14 views
6

利用可能なすべてのクラス(インタフェース、アノテーションなど)をスキャンすることが実行時に可能であるかどうかについての情報は見当たりません。ライブラリは現在、クラスがロードされる方法に関するJigsaw関連の変更に直面しています。実行時にJavaで実行時にclasspath/modulepathをスキャンする9

EDIT: この質問はおよそスキャンクラスを探して、実際の物理的なファイルパスです。 The other questionは動的に約です。のクラスとリソースです。関連していますが、非常には重複していませんです。

UPDATE:桟橋プロジェクトは、このための標準化されたAPIのためのJEP proposalを行いました。この現実を助ける方法があれば、してください。それ以外の場合は、待ち望んでください。

+0

私はあまり変更されていないと思います。あるモジュールが別のモジュールに向かって表示されていれば、あなたはまだ普通のことをすることができます。あなたがモジュールからクラスにアクセスできない場合は、おそらく 'InaccessibleObjectException'のような例外を打つでしょうか、それとも – Eugene

+0

@Eugeneでしょうか?クラスパスは現在、 "レガシー"なものであるように思われるので、_modulepath_に置き換えられます。だから私はクラスパスになっていたものをスキャンしたと推測しています... – kaqqao

+0

[Java 9でクラスとリソースを読み込む]の重複している可能性があります(https://stackoverflow.com/questions/45166757/loading-classes-and-resources- in-java-9) –

答えて

6

私はFastClasspathScannerのためにこれを理解しようとしています。システムがどのようにモジュールを見つけて解決するかについて私が見つけた最良の情報は、hereであり、観測可能なモジュールのリストを取得するコードは、java8-jigsaw-depvishereです。各ModuleReferenceからURLフィールドを取得し、モジュールルート内の各ディレクトリまたはjarを従来のクラスパスの要素であるかのように手動でスキャンします。ただし、手動でスキャンする場合は、ディレクトリのルートにあるmodule-info.classまたはモジュール式jarfile(可視情報のためにexportsの定義を読み取るなど)。 ModuleReferenceを使用して各モジュールのリソースを一覧表示し、モジュールロードシステムを使用して、それぞれの名前付きリソースの内容をInputStreamまたはByteBufferにすることもできます。

ある時点で、これらはすべてFastClasspathScannerで透過的にサポートされますが、ここには多くのことがあります。モジュールのリストを取得し、それらをスキャンし、クラスローダーを無視したり、クラスローダーをまだスキャンする必要はありますか? (おそらくクラスパスURLのためにクラスローダーをスキャンする必要があるかもしれません。コマンドラインからclasspathに伝統的なjarファイルを追加することは可能です)。

+1

最後に、いくつかの本当の手掛かり!このおかげでありがとう! – kaqqao

+1

こちらは同じ著者によるより詳細な調査です:https://github.com/lukehutch/fast-classpath-scanner/issues/36 – Vadzim

1

ここで実際に問題となるのは、クラスパス。あなたがそれらを持っているときは、スキャンすることができます。私は、次のされたのは何

  • 現在のクラスのために、現在のモジュール記述子
  • を取得するには、MANIFEST.MF
  • のような各モジュールのオープンリソースのために、すべてのrequiresモジュール
  • を取得MANIFEST.MFパスを削除リソースのURLから
  • モジュールのクラスパス、つまりjarまたはフォルダが残っているものは何か?

私は現在のモジュールのために、現在のコードのクラスパスを取得するために同じことをします。

このようにして、現在作業中のモジュールとそのすべての必須モジュール(1ステップ離れた場所)のクラスパスを収集します。それは私のために働いていました - 私のJava8スキャナはまだ仕事をすることができました。このアプローチでは、追加のVMフラグなどを追加する必要はありません。すべて必要なモジュールを(最初のレベルだけでなく)簡単に入手できるようにこのアプローチを拡張することもできますが、今のところは必要ありません。

Code

関連する問題