您好我有一个项目有两个模块,结构如下
project
│
└───Module1
│ |---abc.jsp
│
│
├───Module2
│----src.main.
|
|---java.
| |---com.xyz.comp
| │----------Action.java
|
|
└───resources
|---com.xyz.comp
│ prop.properties
现在我的Module1依赖于Module2的war(Module2是一个独立的war文件)。我的问题是Module1的abc.jsp提交给Module2的Action.java。当我尝试访问prop.properties时会给出空指针异常。
public static void test(){
Properties properties = new Properties();
String propfilename = "com/xyz/comp/prop.properties";
try {
ClassLoader contextClassLoader = Action.class.getClassLoader();
InputStream prpoStream= contextClassLoader.getResourceAsStream(propfilename );
properties.load(propertiesStream);
// bunch of other code
} catch (Exception e) {
}
}
propStream始终为null,因为它无法找到该文件。我是否给出了错误的路径,或者由于这是从另一个模块调用的,因此类加载器无法访问此模块文件?
答案 0 :(得分:3)
问题是资源文件(通常放在src/main/resources
中的文件)最终会出现在war文件的WEB-INF/classes
子目录中。
现在,如果您尝试将propfilename
设置为:
String propfilename = "WEB-INF/classes/com/xyz/comp/prop.properties"
它仍然无法正常运行 (JWS会浮现在脑海中),因为您正在使用Action
类中的类加载器,而您正在尝试使用jar / war中不存在的类加载器从中读取。
这样做的正确方法是引入第三个模块/依赖项 放置共享资源并依赖其他模块的位置 在那。
对于JWS(Java Web Start)和其他使用类似类加载策略的框架,您可以使用“Anchor”方法。
用于类加载的Anchor方法
由于获取给定类的类加载器通常需要事先加载该类,因此一个技巧是将一个虚拟类放在一个只包含properties
文件资源的jar中。假设你在jar文件中有这个结构:
org/example/properties/a.properties
org/example/properties/b.properties
org/example/properties/c.properties
只需在jar中输入一个虚拟类,使它看起来像这样:
org/example/properties/Anchor.class
org/example/properties/a.properties
org/example/properties/b.properties
org/example/properties/c.properties
然后,从其他代码,您现在可以执行此操作并确保类加载按预期工作:
Properties properties = new Properties();
String propFile = "org/example/properties/a.properties";
ClassLoader classLoader = Anchor.class.getClassLoader();
InputStream propStream = classLoader.getResourceAsStream(propFile );
properties.load(propStream);
这是一种更强大的方法。
答案 1 :(得分:0)
试试这个:
ClassLoader classLoader = Thread.currentThread()。getContextClassLoader();