如何在Web应用程序中读取属性文件?

时间:2010-07-01 18:38:42

标签: java properties

属性文件位置为WEB-INF/classes/auth.properties

我无法使用特定于JSF的方式(使用ExternalContext),因为我需要服务模块中的属性文件,该文件不依赖于Web模块。

我已经尝试了

MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties");

但它会返回null

我也尝试用FileInputStream阅读它,但它需要完整的路径,这是不可接受的。

有什么想法吗?

3 个答案:

答案 0 :(得分:51)

几点说明:

  1. 您应该更喜欢Thread#getContextClassLoader()返回的ClassLoader

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    

    返回可以访问所有资源的最基本的类加载器。 Class#getClassLoader()只返回有问题的类的(子)类加载器,它本身可能无法访问所需的资源。它总是在具有单个类加载器的环境中工作,但并不总是在具有复杂的类加载器层次结构的环境中工作,如webapps。

  2. /WEB-INF文件夹不在类路径的根目录中。 /WEB-INF/classes文件夹是。因此,您需要加载相对于该属性的属性文件。

    classLoader.getResourceAsStream("/auth.properties");
    

    如果您选择使用Thread#getContextClassLoader(),请移除前导/

  3. 使用ExternalContext#getResourceAsStream()“引擎盖”的特定于JSF的ServletContext#getResourceAsStream()仅返回来自webcontent(/WEB-INF文件夹所在的位置)的资源,而不是来自类路径。< / p>

答案 1 :(得分:8)

试试这个:

MyService.class.getClassLoader().getResourceAsStream("/auth.properties");

使用getResourceAsStream读取文件在类路径上查找以查找要加载的资源。由于classes目录位于您的webapp的类路径中,因此引用该文件/auth.properties应该有效。

答案 2 :(得分:5)

ResourceBundle(http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html)解决了属性文件的相对/ absotule路径的大部分问题。

它使用Resource类并将其指向Dummy Class以引用属性文件。

例如:

  1. 你有一个名为MAINProperties.properties的文件,里面有一个属性: mail.host = foo.example.com
  2. 创建一个名为MAINProperties的虚拟类,没有任何内容。
  3. 使用以下代码:

    ResourceBundle.getBundle( “com.example.com.MAINProperties”)。的getProperty( “mail.host”)

  4. 就是这样。没有InputStreams。

    Pd积。 Apache Commons有一个名为Apache Commons Configuration的库,它具有许多功能(可重新加载的文件,多种域类型),可以与上述组合使用。