0

我有一个 Maven 项目,我正在使用 One-Jar Maven 插件将其打包为单个胖 jar。根据One-Jar 站点上的此页面,必须使用 One-Jar 打包应用程序以特殊方式进行资源加载,但是该文档并未涵盖如何以不依赖于其自定义类加载器的方式列出资源.

我的问题是:如何以与包装无关的方式在内部 jar 中列出类路径的根目录的内容,这意味着不假设它总是在这种特殊的包装中?正如这个 SO question中所涵盖的,SpringPathMatchingResourcePatternResolver 将不起作用,因为 SpringDefaultResourceLoader忽略了类加载器。

注意:我能找到的最接近的 SO 问题是这个问题,但这并没有解决嵌套 jar 中的类路径资源列表。

4

2 回答 2

1

它可以在 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

于 2017-08-15T20:36:30.350 回答
0

在查看了许多文章、博客文章、网页、站点和 Spring 源代码之后,我得出的结论是,这只是 Java 的一个弱点,以任何理智的方式都是不可能的。

于 2014-04-17T18:24:32.587 回答