它可以在 FAT jar 中完成。你自己的回答说不可能有一个链接到一个页面,表明它是可能的!这不是一个疯狂的解决方案。这是一个稍微修改过的版本:
private List<String> getResourceFiles(String path) throws IOException
{
List<String> files = new ArrayList<>();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL dirURL = classLoader.getResource(path);
if (dirURL.getProtocol().equals("jar"))
{
String jarPath = dirURL.getPath().substring(5, dirURL.getPath().indexOf("!"));
try (final JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8")))
{
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements())
{
String name = entries.nextElement().getName();
if (name.startsWith(path + "/") && !name.endsWith("/"))
{
files.add(name);
}
}
}
return files;
}
// return some other way when not a JAR
}
此版本将递归返回给定资源路径下任何文件的完整资源路径。例如,输入config/rest
将返回该资源文件夹下的文件:
config/rest/options.properties
config/rest/samples/data.json
使用这些值,可以使用 获取资源ClassLoader::getResource
,或者使用 获取资源的内容ClassLoader::getResourceAsStream
。