Maven 如何处理从父级继承的传递依赖项?

How does Maven handle transitive dependencies inherited from parent?

鉴于下面的父子 pom,lib1lib2 都包含 class foo.bar.Test.

父 pom

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>foo</groupId>
    <artifactId>foo-parent</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>my.transitive</groupId>
            <artifactId>lib1</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>

子 pom

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>foo</groupId>
        <artifactId>foo-parent</artifactId>
        <version>1.0</version>
    </parent>
    <artifactId>foo-child</artifactId>
    <dependencies>
        <dependency>
            <groupId>my.transitive</groupId>
            <artifactId>lib2</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>

如果我将 foo-child 作为依赖包含在 myApp 中并实例化 foo.bar.Test,Maven 会解析哪个版本的 class?为什么?

我的应用 pom

<project>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>myApp</artifactId>
    <groupId>myApp</groupId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>foo</groupId>
            <artifactId>foo-child</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>

简短的回答是:这取决于首先在类路径中找到哪个。

将 2 个相同的 类 与应用程序打包在一起并不理想,因为它会导致许多难以调试的错误...如果您的 myApp 项目只是一个 jar,那么它将是最好使用与在 运行 时可用的库相同的库对其进行编译。

我相信 maven 使用它写入 pom 的顺序来构建。一种查看方式是 运行 myApp 的以下命令:

mvn dependency:tree -详细

这将按照规范在类路径中出现的顺序打印依赖项。您始终可以使用排除来排除任何您可能不需要的继承库。希望这有帮助。