を使用して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:/リソースで同じ問題が発生します。