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

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

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

我已经试过了

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

但它返回null

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

有任何想法吗?

几点说明:

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

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

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

  2. /WEB-INF文件夹不在类路径的根目录中。 /WEB-INF/classes文件夹是。 所以你需要加载相对于它的属性文件。

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

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

使用ServletContext#getResourceAsStream() “在ServletContext#getResourceAsStream()下”的特定于JSF的ExternalContext#getResourceAsStream()仅从webcontent( /WEB-INF文件夹所在的位置)返回资源,而不是从类路径返回资源。

尝试这个:

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

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

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”)

就是这样。 无需InputStreams。

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