91

如何ClassLoader.getResources()从我的类路径中递归查找资源?

例如

  • 在“目录”中查找所有资源META-INF:想象一下

    getClass().getClassLoader().getResources("META-INF")

    不幸的是,这只会URL准确地检索到这个“目录”。

  • 命名的所有资源bla.xml(递归)

    getClass().getClassLoader().getResources("bla.xml")

    但这会返回一个空的Enumeration.

作为一个额外的问题:与 有何ClassLoader.getResources()不同ClassLoader.getResource()

4

5 回答 5

43

Spring 框架有一个类允许递归搜索类路径:

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resolver.getResources("classpath*:some/package/name/**/*.xml");
于 2013-06-24T19:41:17.323 回答
25

没有办法通过类路径递归搜索。您需要知道资源的完整路径名才能以这种方式检索它。资源可能在文件系统的目录中或在 jar 文件中,因此它不像执行“类路径”的目录列表那么简单。您需要提供资源的完整路径,例如“/com/mypath/bla.xml”。

对于第二个问题, getResource 将返回与给定资源名称匹配的第一个资源。搜索类路径的顺序在getResource 的 javadoc 中给出。

于 2011-03-04T12:45:34.807 回答
22

这是获取某个 URL 对象指向的 File 对象的最简单方法:

File file=new File(url.toURI());

现在,对于您的具体问题:

  • 在 META-INF“目录”中查找所有资源:

您确实可以获得指向此 URL 的 File 对象

Enumeration<URL> en=getClass().getClassLoader().getResources("META-INF");
if (en.hasMoreElements()) {
    URL metaInf=en.nextElement();
    File fileMetaInf=new File(metaInf.toURI());

    File[] files=fileMetaInf.listFiles();
    //or 
    String[] filenames=fileMetaInf.list();
}
  • 所有名为 bla.xml 的资源(递归)

在这种情况下,您必须执行一些自定义代码。这是一个虚拟示例:

final List<File> foundFiles=new ArrayList<File>();

FileFilter customFilter=new FileFilter() {
    @Override
    public boolean accept(File pathname) {

        if(pathname.isDirectory()) {
            pathname.listFiles(this);
        }
        if(pathname.getName().endsWith("bla.xml")) {
            foundFiles.add(pathname);
            return true;
        }
        return false;
    }

};      
//rootFolder here represents a File Object pointing the root forlder of your search 
rootFolder.listFiles(customFilter);

foundFiles运行代码时,您将在列表中获得所有找到的出现。

于 2011-03-04T13:03:54.787 回答
12

这是基于 bestsss 答案的代码:

    Enumeration<URL> en = getClass().getClassLoader().getResources(
            "META-INF");
    List<String> profiles = new ArrayList<>();
    while (en.hasMoreElements()) {
        URL url = en.nextElement();
        JarURLConnection urlcon = (JarURLConnection) (url.openConnection());
        try (JarFile jar = urlcon.getJarFile();) {
            Enumeration<JarEntry> entries = jar.entries();
            while (entries.hasMoreElements()) {
                String entry = entries.nextElement().getName();
                System.out.println(entry);
            }
        }
    }
于 2013-03-11T05:43:48.203 回答
5

MRalwasser,我会给你一个提示,URL.getConnection()投到JarURLConnection. 然后使用 JarURLConnection.getJarFile() 瞧!你有 JarFile 并且你可以自由地访问里面的资源。

剩下的交给你。

希望这可以帮助!

于 2011-03-04T12:57:33.500 回答