Maven 如何处理从父级继承的传递依赖项?
How does Maven handle transitive dependencies inherited from parent?
鉴于下面的父子 pom,lib1
和 lib2
都包含 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 -详细
这将按照规范在类路径中出现的顺序打印依赖项。您始终可以使用排除来排除任何您可能不需要的继承库。希望这有帮助。
鉴于下面的父子 pom,lib1
和 lib2
都包含 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 -详细
这将按照规范在类路径中出现的顺序打印依赖项。您始终可以使用排除来排除任何您可能不需要的继承库。希望这有帮助。