我已在库A的父POM中定义了版本4.3,但在由子POM指定的项目模块中,需要版本2.5的A。我面临的问题是两个版本都被保留,因此我遇到了冲突。
请建议如何解决这个问题。
我已在库A的父POM中定义了版本4.3,但在由子POM指定的项目模块中,需要版本2.5的A。我面临的问题是两个版本都被保留,因此我遇到了冲突。
请建议如何解决这个问题。
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
依赖关系解析(Dependency mediation) - 当遇到多个版本的工件时,决定使用哪个版本的依赖关系。目前,Maven 2.0只支持使用“最近的定义(nearest definition)”方式,这意味着它将使用最靠近项目依赖树中的依赖关系的版本。您可以通过在项目的POM文件中显式声明来保证版本的一致性。请注意,如果两个依赖版本在依赖树中处于同一深度,则在Maven 2.0.8之前并未定义谁胜出,但自Maven 2.0.9以来,这取决于声明的顺序:第一个声明胜出。
- “最近的定义”(nearest definition)表示将使用在依赖树中最靠近您的项目的那个版本,例如,如果A、B和C的依赖关系被定义为A -> B -> C -> D 2.0和A -> E -> D 1.0,则在构建A时将使用D 1.0,因为从A到D通过E的路径更短。您可以在A中明确添加对D 2.0的依赖来强制使用D 2.0。
看起来另一个依赖正在传递地包含了A版本2.5。这会让版本4.3和2.5处于同一深度。
通过在您的项目中明确定义A 2.5的依赖关系,它将成为最近的依赖关系,并覆盖任何其他版本。
一般建议在classpath中同一时间只有一个依赖项版本。这样做可以确保您知道将在运行时使用哪个类的版本。
为避免版本冲突,请尝试像这样指定您的依赖项:
<dependency>
<groupId>commons-daemon</groupId>
<artifactId>commons-daemon</artifactId>
<version>1.0.1</version>
<exclusions>
<exclusion>
<groupId>some_group</groupId>
<artifactId>some_artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
在需要指定版本为2.5的冲突依赖项的groupId
和artifactId
处进行设置。