读取多模块项目中的属性文件

时间:2015-11-20 07:23:20

标签: java maven tomcat properties multi-module

您好我有一个项目有两个模块,结构如下

project
│ └───Module1 │ |---abc.jsp │
│ ├───Module2 │----src.main. | |---java. | |---com.xyz.comp | │----------Action.java |
| └───resources |---com.xyz.comp │ prop.properties

现在我的Module1依赖于Module2的war(Module2是一个独立的war文件)。我的问题是Module1的abc.jsp提交给Module2的Action.java。当我尝试访问prop.properties时会给出空指针异常。

public static void test(){
    Properties properties = new Properties();
   String propfilename = "com/xyz/comp/prop.properties";

    try {
        ClassLoader contextClassLoader = Action.class.getClassLoader();

        InputStream prpoStream= contextClassLoader.getResourceAsStream(propfilename );


        properties.load(propertiesStream);

        // bunch of other code
    } catch (Exception e) {

    }
}

propStream始终为null,因为它无法找到该文件。我是否给出了错误的路径,或者由于这是从另一个模块调用的,因此类加载器无法访问此模块文件?

2 个答案:

答案 0 :(得分:3)

问题是资源文件(通常放在src/main/resources中的文件)最终会出现在war文件的WEB-INF/classes子目录中。

现在,如果您尝试将propfilename设置为:

String propfilename = "WEB-INF/classes/com/xyz/comp/prop.properties" 

它仍然无法正常运行 (JWS会浮现在脑海中),因为您正在使用Action类中的类加载器,而您正在尝试使用jar / war中不存在的类加载器从中读取。

  

这样做的正确方法是引入第三个模块/依赖项   放置共享资源并依赖其他模块的位置   在那。

对于JWS(Java Web Start)和其他使用类似类加载策略的框架,您可以使用“Anchor”方法。

用于类加载的Anchor方法

由于获取给定类的类加载器通常需要事先加载该类,因此一个技巧是将一个虚拟类放在一个只包含properties文件资源的jar中。假设你在jar文件中有这个结构:

org/example/properties/a.properties
org/example/properties/b.properties
org/example/properties/c.properties

只需在jar中输入一个虚拟类,使它看起来像这样:

org/example/properties/Anchor.class
org/example/properties/a.properties
org/example/properties/b.properties
org/example/properties/c.properties

然后,从其他代码,您现在可以执行此操作并确保类加载按预期工作:

Properties properties = new Properties();
String propFile = "org/example/properties/a.properties";

ClassLoader classLoader = Anchor.class.getClassLoader();
InputStream propStream = classLoader.getResourceAsStream(propFile );

properties.load(propStream);

这是一种更强大的方法。

答案 1 :(得分:0)

试试这个:

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