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

Posted

技术标签:

【中文标题】在多模块项目中读取属性文件【英文标题】: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 以使其对它可见? 【参考方案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);

这是一种更稳健的方式。

【讨论】:

我真的很喜欢锚逻辑

以上是关于在多模块项目中读取属性文件的主要内容,如果未能解决你的问题,请参考以下文章

错误:error.NonExistentClass Kotlin 在多模块 Dagger 项目中

如何在多模块项目中配置 Flutter 模块

在多模块 Maven 项目中更新模块的版本号

在多模块 Maven 项目中构建所有模块后,如何运行集成测试?

在多模块 Maven 项目中运行 exec-maven-plugin 时出现问题

使用 Spring 在多模块 Maven 项目中进行集成测试