我在使用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:/ 资源都有相同的问题。