访问jar依赖项

时间:2018-04-06 12:57:18

标签: java maven properties resources classpath

我有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依赖项中的文件

编辑:包裹如下

  • com.nicky.projectA
  • com.nicky.projectB

由于项目B找到了config.properties文件,因此没有输出错误堆栈,但是它位于com.nicky.projectB / resources而不是projectA的资源文件夹中。

编辑:更改其中一个属性的文件名似乎解决了这个问题。我假设它首先搜索父项目并默认为该属性文件,因为它们具有相同的名称。

1 个答案:

答案 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)在同一个包中。(

一旦你正确地使用了这种方式,正如你可能已经在为类做的那样,你就不会再有名字冲突了。