如何正确使用ClassLoader.getResources()?

我如何使用ClassLoader.getResources()从我的类path中查找recursion资源?

例如

  • findMETA-INF “目录”中的所有资源:设想一下类似的东西

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

    不幸的是,这只能检索到这个“目录”的URL

  • 所有名为bla.xml资源(recursion)

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

    但是这返回一个空的Enumeration

作为一个额外的问题: ClassLoader.getResources()ClassLoader.getResource()什么不同?

没有办法通过类pathrecursionsearch。 您需要知道资源的完整path名以便能够以这种方式检索它。 资源可能位于文件系统的目录或jar文件中,因此不像执行“classpath”目录列表那样简单。 您将需要提供资源的完整path,例如“/com/mypath/bla.xml”。

对于第二个问题,getResource将返回与给定资源名称匹配的第一个资源。 在javadoc中为getResource提供了search类path的顺序。

Spring框架有一个允许recursionsearch类path的类:

 PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); resolver.getResources("classpath*:some/package/name/**/*.xml"); 

这是获取某个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的资源(recursion)

在这种情况下,你将不得不做一些自定义代码。 这是一个虚拟的例子:

 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列表中find所有find的foundFiles

这里是基于bestsss的答案的代码:

  Enumeration<URL> en = getClass().getClassLoader().getResources( "META-INF"); List<String> profiles = new ArrayList<>(); if (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); } } } 

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

剩下的我留给你。

希望这可以帮助!

Interesting Posts