我遇到了依赖关系的问题:树。困扰了我几天。我在名为 A 的模块之一的 pom.xml 中定义了版本 6.6.0 的 solr-solrj ,如下所示:
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>6.6.0</version>
</dependency>
另一个名为 B 的模块依赖于模块 A。当我运行时mvn dependency:tree -Dverbose -Dincludes=org.apache.solr:solr-solrj
,会出现控制台org.apache.solr:solr-solrj:jar:5.5.3:compile (version managed from 6.6.0)
。我找到了所有的pom.xml,我没有定义5.5.3版本。而且我在我的项目中没有发现任何对 5.5.3 版本的 jar 依赖关系。
是什么意思5.5.3:compile (version managed from 6.6.0
?为什么我的项目中出现了5.5.3版本?
pic1是我用idea来展示依赖关系。pic2是我点击solrj跳转到pom.xml。
模块 B 的 pom 或模块 B 的父 pom 包含一个<dependencyManagement>
部分。maven 中使用依赖管理来集中 jar 所使用的版本。它可能会覆盖您定义的solr-solrj版本 5.5.3。依赖管理主要通过两种方式发挥作用。您可能正在经历第 2 节中描述的情况。请参阅结论以获取针对您的问题的摘要。
因此,当在 节中定义工件版本时,<dependencyManagement>
您可以在 pom 中声明依赖项而无需定义版本,并且<dependencyManagement>
将自动使用 中定义的版本。
假设你的父 pom 定义了以下内容
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.mememe</groupId>
<artifactId>mylib</artifactId>
<version>1.1.12</version>
</dependency>
</dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)
那么如果你在 pom 中定义了以下内容
<dependencies>
<dependency>
<groupId>com.mememe</groupId>
<artifactId>mylib</artifactId>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
<dependencyManagement>
您的项目将自动使用父 pom.xml 部分中定义的版本 1.1.12 。
如果您在您的代码中定义了一个工件版本,并且您的依赖项之一对同一工件具有传递依赖关系,则将自动使用<dependencyManagement>
您的部分中定义的工件版本。<dependencyManagement>
就说这个神器
<dependency>
<groupId>com.youyou</groupId>
<artifactId>yourlib</artifactId>
<version>3.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
具有这种传递依赖
<dependency>
<groupId>com.morestuff</groupId>
<artifactId>morelib</artifactId>
<version>2.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
现在假设我们的父 pom 定义了这个<dependencyManagement>
部分
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.morestuff</groupId>
<artifactId>morelib</artifactId>
<version>2.5.2</version>
</dependency>
</dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)
那么如果你在 pom 中定义了这个依赖项
<dependency>
<groupId>com.youyou</groupId>
<artifactId>yourlib</artifactId>
<version>3.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
Maven 将使用morelib版本 2.5.2 覆盖yourlib对morelib版本 2.0.0的依赖。
针对您的问题,有人<dependencyManagement>
在模块 B 的 pom 或父 pom 中定义了如下所示的部分:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.5.3</version>
</dependency>
</dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)
由于solr-solrj是模块 A 的依赖项,而 mondule A 是模块 B 的依赖项。依赖项管理将solr-solrj的版本覆盖为 5.5.3 。您应该与在您的项目中添加此 dependencyManagement 配置的人交谈,他们可能有充分的理由只希望使用版本 5.5.3。
请参阅此处的官方 Maven 文档了解更多详细信息。
归档时间: |
|
查看次数: |
2828 次 |
最近记录: |