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

Rom*_*man 26 java properties

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

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

我已经试过了

MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties");
Run Code Online (Sandbox Code Playgroud)

但它回来了null.

我也试过阅读它,FileInputStream但它需要完整的路径是不可接受的.

有任何想法吗?

Bal*_*usC 52

几点说明:

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

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    classLoader.getResourceAsStream("/auth.properties");
    
    Run Code Online (Sandbox Code Playgroud)

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

ExternalContext#getResourceAsStream()使用ServletContext#getResourceAsStream()"引擎盖" 的JSF特定的只返回来自webcontent(/WEB-INF文件夹所在的位置)的资源,而不是来自类路径.


Jes*_*per 8

试试这个:

MyService.class.getClassLoader().getResourceAsStream("/auth.properties");
Run Code Online (Sandbox Code Playgroud)

读取getResourceAsStream类路径上具有外观的文件以查找要加载的资源.由于classes目录位于webapp的类路径中,因此引用该文件/auth.properties应该可行.


小智 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")

就是这样.无需InputStreams.

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