从尚未加载的另一个JAR加载资源

时间:2014-12-21 16:54:24

标签: java tomcat jar classloader

我试图从尚未加载的第二个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(),但我并不相信这些内容是' s对了。

非常感谢任何帮助。我试图了解ClassLoader如何工作并编写这个(应该是简单的)项目来帮助。

1 个答案:

答案 0 :(得分: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);
            }
        }
    }

这有帮助吗?