我遇到了依赖问题:树。几天困扰我。
我在我的pom.xml中的一个名为A的模块中定义了版本为6.6.0的solr-solrj,如下所示:
T
另一个名为模块A的B依赖项的模块。当我运行<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>6.6.0</version>
</dependency>
时,控制台显示为mvn dependency:tree -Dverbose -Dincludes=org.apache.solr:solr-solrj
。我找到了所有的pom.xml,我还没有定义5.5.3版本。在我的项目中,我还没有在5.5.3版本上发现任何jar依赖项。
org.apache.solr:solr-solrj:jar:5.5.3:compile (version managed from 6.6.0)
的含义是什么?为什么5.5.3版本出现在我的项目中?
pic1是我使用idea来显示依赖关系。 pic2是我点击solrj跳转到pom.xml。
答案 0 :(得分:2)
模块B的pom或模块B的父pom包括<dependencyManagement>
部分。在maven中使用依赖关系管理来集中用于jar的版本。它可能会覆盖您定义为版本5.5.3的 solr-solrj 版本。依赖管理功能主要有两种。您可能正在体验第2部分中描述的内容。请参阅结论以获取特定于您的问题的摘要。
因此,当<dependencyManagement>
部分中定义工件版本时,您可以在不定义版本的情况下在pom中声明依赖关系,并且将自动使用<dependencyManagement>
中定义的版本。
让我们说你的父pom定义了以下内容
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.mememe</groupId>
<artifactId>mylib</artifactId>
<version>1.1.12</version>
</dependency>
</dependencies>
</dependencyManagement>
然后,如果您在pom中定义以下内容
<dependencies>
<dependency>
<groupId>com.mememe</groupId>
<artifactId>mylib</artifactId>
</dependency>
</dependencies>
您的项目将自动使用您父p的<dependencyManagement>
部分中定义的1.1.12版。
如果您的<dependencyManagement>
中定义了工件版本,并且其中一个依赖项对同一工件具有传递依赖性,则会自动使用<dependencyManagement>
部分中定义的工件版本。 / p>
让我们说这个神器
<dependency>
<groupId>com.youyou</groupId>
<artifactId>yourlib</artifactId>
<version>3.0.0</version>
</dependency>
是否存在这种传递依赖
<dependency>
<groupId>com.morestuff</groupId>
<artifactId>morelib</artifactId>
<version>2.0.0</version>
</dependency>
现在让我们说我们的父pom定义了这个<dependencyManagement>
部分
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.morestuff</groupId>
<artifactId>morelib</artifactId>
<version>2.5.2</version>
</dependency>
</dependencies>
</dependencyManagement>
然后,如果您在pom中定义此依赖关系
<dependency>
<groupId>com.youyou</groupId>
<artifactId>yourlib</artifactId>
<version>3.0.0</version>
</dependency>
Maven将使用 morelib 版本2.5.2覆盖 yourlib 对 morelib 版本2.0.0的依赖。
根据您的问题,有人在模块B的pom或父pom中定义了如下所示的<dependencyManagement>
部分:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.5.3</version>
</dependency>
</dependencies>
</dependencyManagement>
由于 solr-solrj 是模块A的依赖关系,因此mondule A是模块B的依赖关系。依赖关系管理将 solr-solrj 的版本覆盖为5.5 .3。您应该与在项目中添加此dependencyManagement配置的人员交谈,可能有充分的理由说明他们只希望使用版本5.5.3。
在官方专家文档here中查看更多详情。