【问题标题】:read properties file in multi module project在多模块项目中读取属性文件
【发布时间】:2016-02-22 14:38:05
【问题描述】:

您好,我有一个项目,它有两个具有以下结构的模块

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 始终为空,因为它找不到文件。我给的路径是错误的还是因为这是从另一个模块调用的,所以类加载器无权访问这个模块文件?

【问题讨论】:

  • 您是否将 module2 添加到 module1 以使其对它可见?

标签: java maven tomcat properties multi-module


【解决方案1】:

试试这个:

类加载器 classLoader = Thread.currentThread().getContextClassLoader();

【讨论】:

    【解决方案2】:

    问题是资源文件(通常放在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 方法

    由于获取给定类的类加载器通常需要您事先加载该类,因此一个技巧是将一个虚拟类放入一个仅包含资源的 jar 中,例如 properties 文件。假设你在一个 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);
    

    这是一种更稳健的方式。

    【讨论】:

    • 我真的很喜欢锚逻辑
    猜你喜欢
    • 2018-03-28
    • 2017-02-26
    • 2013-01-12
    • 2011-03-25
    • 2014-12-11
    • 2019-03-11
    • 2015-09-07
    • 2013-10-17
    • 2019-02-18
    相关资源
    最近更新 更多