我正在尝试从我的Web应用程序(一个简单的Servlet应用程序)调用JAR文件中存在的方法。下面是该方法用于访问属性文件的代码:
InputStream inputStream =
ClassLoader.getSystemClassLoader()
.getResourceAsStream("demo.properties");
properties.load(inputStream);
使用我的Web应用程序调用此方法时,我收到此NullPointerException
:
java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Unknown Source)
at java.util.Properties.load0(Unknown Source)
at java.util.Properties.load(Unknown Source)
此异常的可能原因是:我的Web应用程序无法找到demo.properties
文件,因此inputStream
为NULL
并抛出此异常。
请告诉我:
如何解决此异常。
我是否需要在基于Web的应用程序中手动放置属性文件?如果是,则确切地将此demo.properties
文件放在我的Web应用程序中以解决此异常的位置。
答案 0 :(得分:2)
类加载器将传递的字符串解释为绝对路径,因此好像它是/demo.properties
(但从不使用ClassLoader.getResource
的标题斜杠)。所以打开战争,寻找/WEB-INF/classes/demo.properties
。这必须区分大小写。
您可能(通常)对替代方案感兴趣:
MyServletClass.class.getResourceAsStream("/demo.properties")
- 更好; ResourceBundle bundle = ResourceBundle.get("demo");
/WEB-INF/web.xml
。答案 1 :(得分:2)
系统类加载器只知道核心Java库,例如java.lang。,java.util。等中的库。
您希望使用相同的类加载器加载属性文件,该加载器查看该JAR文件,该文件可能与加载您的类的类加载器相同。
尝试这样的事情:
public class PropertyFileTest {
public void loadProperties() {
InputStream inputStream = PropertyFileTest.class.getResourceAsStream("/demo.properties");
properties.load(inputStream);
// do something with properties to see if it worked or not.
}
}
请注意,我使用了Class.getResourceAsStream,它将为您使用该类的类加载器:
http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
答案 2 :(得分:-1)
ClassLoader未识别哪个属性文件位置。
使用此代码:
String path = AbcServiceImpl.class.getClassLoader().getResource("abc.properties").getFile().toString();
path = path.replace("%20", " ");
File f = new File(path);