访问* .war类路径资源

时间:2012-12-06 23:43:01

标签: resources java-ee-6 jboss7.x java-7 vfs

我在使用ClassLoader#getResources(-)访问JBoss中的VFS资源时遇到问题。

我想列出某些Web应用程序(WEB-INF/classes/*)的所有类路径资源(*.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/

因此,使用的Path等于/content/WEB-INF/classes/someResource,它被视为不存在的路径(以root-node,slash开头)并抛出异常。

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

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

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

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

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

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

现在我正在从旧的File对象切换到NIO.2路径,文件和基本上:输入流。
但是,这两种方法都与vfs:/ resources具有相同的问题。

2 个答案:

答案 0 :(得分:2)

以下是否有效?

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

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

while (resources.hasMoreElements()) {
    InputStream is = resources.nextElement().openStream();
}

答案 1 :(得分:0)

使用这个依赖

document.addEventListener('DOMContentLoaded', () => {
    const themeSwitch = document.getElementById('themeCheckBox');

    if(localStorage.darkTheme === 'true'){
        document.body.classList.add('dark');
        themeSwitch.checked = true;
    } else{
        document.body.classList.remove('dark');
        themeSwitch.checked = false;
    }

    themeSwitch.addEventListener('change', () => {    
        if (themeSwitch.checked){
            localStorage.darkTheme = 'true';
            document.body.classList.add('dark');
        } else {
            localStorage.darkTheme = 'false';
            document.body.classList.remove('dark');
        }  
    });
});

导入类

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

从 WAR 中列出所有类的方法

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

用法

 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());
        }
    }
}