0

给定下面的父母和孩子 pomlib1并且lib2两者都包括 class foo.bar.Test

家长会

<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>

儿童绒球

<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 会解析到哪个版本的类?为什么?

我的应用程序 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>
4

1 回答 1

3

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

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

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

mvn 依赖:tree -Dverbose

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

于 2016-09-22T20:20:57.433 回答