在Web应用程序中找不到属性文件

时间:2014-10-06 14:38:23

标签: java java-ee servlets web-applications web

我正在尝试从我的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文件,因此inputStreamNULL并抛出此异常。

请告诉我:

  1. 如何解决此异常。

  2. 我是否需要在基于Web的应用程序中手动放置属性文件?如果是,则确切地将此demo.properties文件放在我的Web应用程序中以解决此异常的位置。

3 个答案:

答案 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
  • 中使用Servlet的init参数

答案 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);