我有2个项目; A和B(两个maven项目)。 A打包为jar并作为项目B的依赖项添加。两个项目都在/ resources文件夹中有一个 config.properties 文件。运行项目B时,位于项目A中的以下代码将加载B&#39资源文件夹:
Properties configProps = new Properties();
try {
InputStream in = classInA.class.getResourceAsStream("/config.properties");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = br.readLine()) != null)
{
String values[] = line.split("=", 2);
configProps.setProperty(values[0], values[1]);
line = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
我在项目B的方法中获得了相同的代码块,并正确访问了B的config.properties文件。知道如何解决这个问题,或者你可以更好地了解如何在jar中运行以及在IDE(Intellij)中运行jar依赖项中的文件
编辑:包裹如下
由于项目B找到了config.properties文件,因此没有输出错误堆栈,但是它位于com.nicky.projectB / resources而不是projectA的资源文件夹中。
编辑:更改其中一个属性的文件名似乎解决了这个问题。我假设它首先搜索父项目并默认为该属性文件,因为它们具有相同的名称。
答案 0 :(得分:1)
getResourceAsStream("/config.properties")
在根路径的类路径中搜索config.properties。
调用方法的代码是在A.jar还是B.jar中,以及文件是在A.jar还是B.jar中并不关心。
它扫描类路径,并返回找到的第一个config.properties文件。如果A.jar在classspath中位于B.jar之前,那么将返回A的配置文件。如果B.jar在类路径中位于A.jar之前,那么将返回B的配置文件。
这个问题正是包存在的原因:避免名称冲突。 A的配置文件不应该在根目录下。它应该与A的类(com.mycompany.a
)在同一个包中。并且B的配置文件应该与B的类(com.mycompany.b
)在同一个包中。(
一旦你正确地使用了这种方式,正如你可能已经在为类做的那样,你就不会再有名字冲突了。