我知道我们可以这样做:
Class.class.getResourceAsStream("/com/youcompany/yourapp/module/someresource.conf")
读取我们的jar文件中打包的文件。
我搜索了很多内容,我肯定没有使用正确的条款;我想要做的是列出可用的资源,如下所示:
Class.class.listResources("/com/yourcompany/yourapp")
这应该返回包com.yourcompany.yourapp.*
这可能吗?关于如何做到这一点的任何想法,以防它不能像我展示的那样轻松完成?
注意:我知道可以知道罐子的位置,然后将其打开并检查其内容以实现它。但是,我不能在我现在工作的环境中这样做。
答案 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(...)
但我怀疑你可以列出类路径中的条目,而不知道它们是先验的。