在多模块项目中读取属性文件
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 项目中
在多模块 Maven 项目中构建所有模块后,如何运行集成测试?