0

我在使用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);
}

如果我在以分解模式部署应用程序的 JBoss AS 7.1 中使用此代码 - 它可以正常工作。
一旦您尝试不以爆炸模式部署它,而是以*.war存档的形式部署它,它就会开始抛出NoSuchFileException.

我认为这是因为未分解的存档使用虚拟文件系统,并且所有此类加载的资源都以`vfs:;开头。就我而言,例如vfs:///content/WEB-INF/classes/someResource/

因此 usedPath等于/content/WEB-INF/classes/someResource并且它被视为不存在的路径(它以根节点,斜杠开头)并引发异常。

暂时忘记所有使用 HTTP、FTP 或其他方式加载资源的情况;我也对在类路径中扫描 jar 不感兴趣。我只想读取类路径根目录上的所有基于文件的资源。

问题是我需要输入每个资源并找出这是否是一个文件夹 - 如果是,请列出它的所有元素。这就是该Path元素在这里非常有用的原因。

问题是 -您应该在 Web 应用程序中列出所有资源的正确方法是什么?

似乎带有 vfs: 前缀的资源是由一些特殊的 JBoss 类加载器加载的,对吧?

因此,我什至能够以可移植的方式访问资源(适用于 JBoss、Glassfish、TomEE 的代码......)?

编辑:为您提供我需要上述内容的上下文:我想扫描*.properties类路径中的所有文件并能够使用 CDI 访问它们。它已被描述here

现在我正在从旧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 回答