如何获取嵌套Jar中的类路径资源列表?

时间:2014-04-17 17:09:58

标签: java jar resources classpath uberjar

我有一个Maven项目,我使用One-Jar Maven插件将其打包为单个胖罐。根据One-Jar站点上的this page文档,必须使用One-Jar打包应用程序以特殊方式加载资源,但该文档未涵盖如何以不依赖于他们的方式列出资源自定义类加载器。

我的问题是:如何以包装无关的方式在内部jar中列出类路径根目录的内容,这意味着不会假设它总是在这样的特殊包装中?正如this SO question所述,Spring PathMatchingResourcePatternResolver will not work,因为Spring的DefaultResourceLoader忽略了类加载器。

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

2 个答案:

答案 0 :(得分:1)

可以在FAT jar中完成。你自己的答案说明不可能有link to a page表明它是可能的!这不是解决方案的疯狂。这是一个稍微修改过的版本:

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获取资源的内容。

答案 1 :(得分:0)

在审阅了许多文章和博客帖子,web pages,网站和Spring源代码之后,我得出结论,这只是Java中的一个弱点,并且无法以任何合理的方式实现。