如何遍历Java类资源?

问题描述 投票:16回答:5

我知道我们可以做这样的事情:

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

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

我已经在Google上搜索了很多,我肯定没有使用适当的术语;我要做的是列出可用资源,如下所示:

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

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

有可能吗?关于如何做的任何想法,以防无法像我展示的那样容易完成?

注意:我知道有可能知​​道您的罐子在哪里,然后将其打开并检查其内容以达到目的。但是,我不能在现在工作的环境中这样做。

java resources classpath
5个回答
10
投票

对于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<JarEntry> entries = archive.entries();
while (entries.hasMoreElements()) {
  JarEntry entry = entries.nextElement();
  if (entry.getName().startsWith("com/y/app/")) {
    ...
  }
}

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


4
投票

通常无法获得像这样的资源列表。某些类加载器甚至可能都不支持该功能-想象一个可以从Web服务器获取单个文件的类加载器,但是Web服务器不必支持列出目录的内容。当然,对于jar文件,您可以显式加载jar文件的内容。([This question是相似的,顺便说一句。]


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

0
投票
我通常使用

0
投票
用于列出类路径中所有资源的最健壮的机制当前是to use this pattern with ClassGraph,因为它处理widest possible array of classpath specification mechanisms,包括新的JPMS模块系统。 (我是ClassGraph的作者。)
© www.soinside.com 2019 - 2024. All rights reserved.