【问题标题】:Read resources from specific JAR file (duplicate paths to file)从特定 JAR 文件中读取资源(文件的重复路径)
【发布时间】:2018-02-20 19:16:15
【问题描述】:

假设您有 jar1 和 artifactId zoo,jar2 和 artifactId 动物。两个 jar 都有一个具有相同路径的资源文件(例如:/animals/animal.txt)。有没有办法从特定的 jar 中读取该文件?使用 getResourcesAsStream 也会返回第一个 jar,但有时我想要第二个 jar 的 animal.txt 文件。

【问题讨论】:

  • 我想到的第一个问题是:为什么需要从另一个 JAR 中读取资源?并使用你自己的?此外,您阅读的顺序取决于类路径,这通常是不可预测的......除了这听起来很奇怪有两个不同的 jar 包含相同的资源,包括相同的路径等。?
  • 简短的回答是否定的。事实上,这实际上是一个非常巧妙的技巧,可用于生成插件样式框架或不耦合 API 功能。您可以使用ClassLoader#findResources 在类加载器上下文中列出所有命名资源并加载它们,从而允许您动态定位运行时资源。至于你的实际问题。要么更改资源文件的名称,要么在文件中放置一个条目标记,以便您识别它实际上是哪个文件

标签: java maven jar


【解决方案1】:

正如@MadProgrammer 所建议的那样,ClassLoader.getResources() 将返回类似于jar:file:/C:/dir/animals.jar!/animals/animal.txt 的 URL。

所以这样的摘录应该可以选择正确的文件:

    Enumeration<URL> urls = getClass().getClassLoader().getResources("/animals/animal.txt");
    while (urls.hasMoreElements()) {
        URL url = urls.nextElement();
        if (url.toExternalForm().contains("animals.jar!")) {
            System.out.println(url);
            url.openStream()...
        }
    }

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 2021-11-21
    相关资源
    最近更新 更多