を使用してJBossのVFSリソースにアクセスする際に問題が発生しClassLoader#getResources(-)ました。
WEB-INF/classes/*いくつかのWebアプリケーション()のすべてのクラスパスリソース()を一覧表示したい*.warので、次のようなものから始めることができます。
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Enumeration<URL> resources = cl.getResources("");
while (resources.hasMoreElements()) {
Path path = Paths.get(resources.nextElement().toURI());
InputStream is = Files.newInputStream(path);
}
アプリケーションを展開モードでデプロイするJBossAS7.1でこのコードを使用すると、正しく機能します。
展開モードではなく、*.warアーカイブとしてデプロイしようとするとすぐに、がスローされ始めますNoSuchFileException。
分解されていないアーカイブは仮想ファイルシステムを使用し、そのようなロードされたリソースはすべて`vfs:;で始まるためだと思います。私の場合、それは例えばvfs:///content/WEB-INF/classes/someResource/でした。
したがって、usedPathはに等しく、/content/WEB-INF/classes/someResource存在しないパス(root-node、slashで始まる)として扱われ、例外をスローします。
HTTP、FTPなどを使用してリソースがロードされた場合は、しばらくの間忘れてください。クラスパス内のjarをスキャンすることにも興味がありません。クラスパスルート上のすべてのファイルベースのリソースを読み取りたいだけです。
問題は、各リソースを入力して、これがフォルダーであるかどうかを確認する必要があることです。フォルダーである場合は、そのすべての要素をリストします。そのため、このPath要素はここで非常に役立ちます。
問題は、Webアプリケーション内のすべてのリソースを一覧表示する正しい方法は何ですか?
vfs:プレフィックスを持つリソースは特別なJBossクラスローダーによってロードされたようですよね?
したがって、ポータブルな方法でリソースにアクセスすることもできますか(JBoss、Glassfish、TomEEなどで機能するコード)?
編集:*.properties上記が必要な理由を説明するために:クラスパス内のすべてのファイルをスキャンし、CDIでそれらにアクセスできるようにしたいと思います。ここで説明されています。
現在、古いFileオブジェクトからNIO.2パス、ファイル、そして基本的には入力ストリームに切り替えています。
ただし、どちらのアプローチでも、vfs:/リソースで同じ問題が発生します。