如何浏览Java类资源?

时间:2009-04-14 22:02:27

标签: java resources classpath

我知道我们可以这样做:

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

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

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

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

这应该返回包com.yourcompany.yourapp.*

内的资源列表

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

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

5 个答案:

答案 0 :(得分: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方案指定特定代码。

答案 1 :(得分:4)

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

This question类似,顺便说一句。)

答案 2 :(得分:2)

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

答案 3 :(得分:1)

当前列出类路径中所有资源的最健壮的机制是to use this pattern with ClassGraph,因为它处理widest possible array of classpath specification mechanisms,包括新的JPMS模块系统。 (我是ClassGraph的作者。)

List<String> resourceNames;
try (ScanResult scanResult = new ClassGraph()
            .whitelistPaths("com/yourcompany/yourapp")
            .scan()) {
    resourceNames = scanResult.getAllResources().getNames();
}

答案 4 :(得分:0)

我通常使用

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

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