【发布时间】: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