如何通过Java类资源?

我知道我们可以这样做:

Class.class.getResourceAsStream("/com/youcompany/yourapp/module/someresource.conf") 

读取我们的jar文件中打包的文件。

我搜索了很多,我肯定没有使用正确的条款; 我想要做的是列出可用的资源,如下所示:

 Class.class.listResources("/com/yourcompany/yourapp") 

这应该返回com.yourcompany.yourapp.*包中的资源列表com.yourcompany.yourapp.*

那可能吗? 关于如何做到这一点的任何想法,以防它不能像我展示的那样轻松完成?

注意:我知道可以知道jar子的位置,然后打开它并检查其内容以实现它。 但是,我不能在我现在工作的环境中这样做。

对于JAR文件中的资源,这样的工作原理:

 URL url = MyClass.class.getResource("MyClass.class"); String scheme = url.getProtocol(); if (!"jar".equals(scheme)) throw new IllegalArgumentException("Unsupported scheme: " + scheme); JarURLConnection con = (JarURLConnection) url.openConnection(); JarFile archive = con.getJarFile(); /* Search for the entries you care about. */ Enumeration entries = archive.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); if (entry.getName().startsWith("com/y/app/")) { ... } } 

您可以使用文件系统或许多其他存储库中“爆炸”的资源执行相同的操作,但这并不是那么容易。 您需要为要支持的每个URL方案指定特定代码。

一般无法获得这样的资源列表。 有些类加载器甚至可能无法支持这一点 – 想象一个可以从Web服务器获取单个文件的类加载器,但Web服务器不必支持列出目录的内容。 对于jar文件,您当然可以显式加载jar文件的内容。

( 这个问题很相似,顺便说一下。)

我一直在寻找一种使用类加载器列出jar文件内容的方法,但不幸的是,这似乎是不可能的。 相反,你可以做的是打开jar作为一个zip文件,并以这种方式获取内容。 您可以使用标准( 此处 )方式读取jar文件的内容,然后使用类加载器来读取内容。

我经常使用

 getClass().getClassLoader().getResourceAsStream(...) 

但我怀疑你可以列出类路径中的条目,而不知道它们的先验。