我试图从尚未加载的第二个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如何工作并编写这个(应该是简单的)项目来帮助。
答案 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);
}
}
}
这有帮助吗?