【问题标题】:How to Get List of Classpath Resources In Nested Jar?如何获取嵌套 Jar 中的类路径资源列表?
【发布时间】:2023-03-23 01:16:01
【问题描述】:

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

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

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

【问题讨论】:

  • PathMatchingResourcePatternResolver 确实有一个接受ClassLoader 的重载构造函数,如果你能得到OneJar 的话。
  • 如果我不想将它绑定到OneJar 框架怎么办?似乎是关于从嵌套 jar 加载资源的更一般的问题。

标签: java jar resources classpath uberjar


【解决方案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 获取资源的内容。

【讨论】:

    【解决方案2】:

    在查看了许多文章和博客帖子、web pages、站点和 Spring 源代码之后,我得出结论,这只是 Java 的一个弱点,在任何理智的情况下都是不可能的。

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多