16

我知道我们可以这样做:

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

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

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

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

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

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

注意:我知道可以知道你的 jar 在哪里,然后打开它并检查它的内容以实现它。但是,我不能在我现在工作的环境中做到这一点。

4

5 回答 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 方案,您都需要特定的代码。

于 2009-04-14T22:34:40.653 回答
4

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

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

于 2009-04-14T22:09:30.637 回答
2

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

于 2009-04-14T22:08:33.227 回答
2

列出类路径中所有资源的最健壮的机制目前是将此模式与 ClassGraph 一起使用,因为它处理最广泛的类路径规范机制,包括新的 JPMS 模块系统。(我是 ClassGraph 的作者。)

List<String> resourceNames;
try (ScanResult scanResult = new ClassGraph()
            .whitelistPaths("com/yourcompany/yourapp")
            .scan()) {
    resourceNames = scanResult.getAllResources().getNames();
}
于 2019-10-05T11:00:43.320 回答
-1

我通常使用

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

但我怀疑您是否可以在不事先知道它们的情况下列出类路径中的条目。

于 2009-04-14T22:03:58.683 回答