【问题标题】:Load resource from another JAR that hasn't been loaded从另一个尚未加载的 JAR 加载资源
【发布时间】:2015-02-19 21:31:57
【问题描述】:

我正在尝试从尚未加载的第二个 JAR 加载资源(纯文本文件)。该资源将包含一个字符串,该字符串表示我计划使用的第二个 jar 中的一个类。

我无法找到加载此资源的正确方法,以前的类似问题也没有让我更进一步。这是我正在使用的:

public void readResource() {
   ClassLoader loader = Thread.currentThread().getContextClassLoader();
}

我可以在这个 ClassLoader(最终成为 WebappClassLoader)中看到目录中的 jar 列表:

jarNames: [com.mysql.jdbc.jar, productivity-common.jar]
jarPath: /WEB-INF/lib

当我尝试使用 ClassLoader 加载文件时,我收到 NullPointerException:

String path = loader.getResource("com/productivity/common/META-INF/providers/hello.txt").getPath();

如果这可行,我的下一步将是使用 InputStream 读取此文件中的值,并尝试从同一个第二个 jar 中创建与该值匹配的类的新实例。根据我正在阅读的内容,我会使用该类的路径并使用 Class.forName("value").newInstance(),但我也不确定这是否正确。

任何帮助将不胜感激。我正在尝试了解 ClassLoaders 的工作原理并编写这个(应该很简单的)项目来提供帮助。

【问题讨论】:

  • 文件和路径是否相同?表示两个 jar 文件中的 com/test/abc.properties?
  • 我的文件只在一个罐子里。我的第一个 jar 包是 com.test.forecaster,它不包含任何资源。这是我的 webapp 通过 Tomcat 调用的主要 jar。我的第二个 jar 是 com.productivity.common,其中包含 src/main/resources/META-INF/providers/hello.txt
  • 我回答了下面的问题。棘手的部分是在 getResources 中提供正确的目录结构。只需打开jar文件并找出路径。这里我的假设是“META-INF/providers/hello.txt”会起作用。
  • 我刚刚学到了另一个有趣的东西。如果你在 mac 或 unix 中,你可以尝试在“vi”中打开 jar 文件,它会显示所有带有路径的文件。示例 vi test.jar

标签: java tomcat jar classloader


【解决方案1】:

假设您有两个同名的资源文件“spring/label.properties”存储在两个不同的 jar 文件中。

您可以使用以下代码从类路径中查找所有文件的列表,然后根据路径进行过滤。

     Enumeration<URL> en =  this.getClass().getClassLoader().getResources("spring/label.properties");
     while(en.hasMoreElements()){
        URL url = en.nextElement();
        //Print all path to visualize the path
        System.out.println(url.getPath());
        if(url.getPath().contains("my-jar")){ // This can be jar name
            BufferedReader reader = new BufferedReader(new InputStreamReader(en.nextElement().openStream()));
            String str = null;
            while((str = reader.readLine())!=null){
                // Now you can do anything with the content.
                System.out.println(str);
            }
        }
    }

这有帮助吗?

【讨论】:

  • 刚试过这个,'en' 最终是空的。我已经尝试了当前类的类加载器以及当前线程的上下文类加载器,getResources() 指向“META-INF/providers/hello.txt”。我什至将相同的文本文件添加到我的“主”jar 中路径 WebContent/META-INF/providers/hello.txt,更改了 getResources() 中的路径,仍然导致空枚举。
  • 你试过打开jar并检查内容吗?
  • 哇...我一直都做对了,显然,当我将第二个项目导出到 JAR 中时,那是在我添加资源文件之前。叹息..谢谢!
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多