0

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

4

2 に答える 2

2

次は機能しますか?

ClassLoader cl = Thread.currentThread().getContextClassLoader();

Enumeration<URL> resources = cl.getResources("");

while (resources.hasMoreElements()) {
    InputStream is = resources.nextElement().openStream();
}
于 2012-12-07T12:58:32.620 に答える
0

この依存関係を使用する

    <dependency>
        <groupId>org.jboss</groupId>
        <artifactId>jboss-vfs</artifactId>
        <version>3.2.15.Final</version>
    </dependency>

クラスをインポートする

import org.jboss.vfs.VFS;
import org.jboss.vfs.VirtualFile;
import org.jboss.vfs.VirtualFileFilter;

WARからすべてのクラスをリストするためのメソッド

 public void scan(ClassLoader classLoader) throws IOException, URISyntaxException {
    String optionalMainPackage="";
    // Example optionalMainPackage="com.domolin.security"
    Enumeration resources = classLoader.getResources(optionalMainPackage);
    while (resources.hasMoreElements()) {
        URL resource = (URL) resources.nextElement();
        System.out.println("URL "+resource);
        VirtualFile vfDir = VFS.getChild(resource.toURI());
        List<VirtualFile> jsonVFs = vfDir.getChildrenRecursively(new VirtualFileFilter() {
            @Override
            public boolean accepts(VirtualFile file) {
                return (file.isDirectory() || file.getName().endsWith(".class"));
            }
        });
        for (int i = 0; i < jsonVFs.size(); i++) {
            VirtualFile vf = jsonVFs.get(i);
            File f = vf.getPhysicalFile();
            System.out.println("CLASS: "+f.getName());
        }
    }
}

使用法

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
scan(classLoader);
于 2021-03-27T20:13:02.437 に答える