maven dependency:tree 日志:版本 1 编译(版本从版本 2 管理)
maven dependency:tree log: version1 compile (version managed from version2)
我遇到了 dependency:tree 的问题。困扰了我几天。
我在名为 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 的版本。它可能会覆盖您定义为版本 5.5.3 的 solr-solrj 版本。依赖管理以两种主要方式发挥作用。您可能遇到了第 2 部分中描述的情况。请参阅结论以获取针对您的问题的特定摘要。
1。它是定义依赖项版本的中心位置。
因此,当在<dependencyManagement>
部分定义了工件版本时,您可以在pom中声明依赖而不定义版本,并且将自动使用<dependencyManagement>
中定义的版本。
示例 1
假设您的父 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>
您的项目将自动使用您父 pom 的 <dependencyManagement>
部分中定义的版本 1.1.12。
2。覆盖传递依赖的版本。
如果您在 <dependencyManagement>
中定义了工件版本并且您的依赖项之一对同一工件具有传递依赖性,则自动使用 <dependencyManagement>
部分中定义的工件版本.
示例 2
比方说这个神器
<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 覆盖 yourlib 对 morelib 版本 2.0.0 的依赖版本 2.5.2.
结论
针对您的问题,有人在模块 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 的依赖项,模块 A 是模块 B 的依赖项。依赖项管理覆盖了 [ 的版本=78=] 为 5.5.3 。你应该和在你的项目中添加这个 dependencyManagement 配置的人谈谈,他们只希望使用 5.5.3 版本可能是有充分理由的。
文档
在官方 maven 文档中查看更多详细信息here。
我遇到了 dependency:tree 的问题。困扰了我几天。 我在名为 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 的版本。它可能会覆盖您定义为版本 5.5.3 的 solr-solrj 版本。依赖管理以两种主要方式发挥作用。您可能遇到了第 2 部分中描述的情况。请参阅结论以获取针对您的问题的特定摘要。
1。它是定义依赖项版本的中心位置。
因此,当在<dependencyManagement>
部分定义了工件版本时,您可以在pom中声明依赖而不定义版本,并且将自动使用<dependencyManagement>
中定义的版本。
示例 1
假设您的父 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>
您的项目将自动使用您父 pom 的 <dependencyManagement>
部分中定义的版本 1.1.12。
2。覆盖传递依赖的版本。
如果您在 <dependencyManagement>
中定义了工件版本并且您的依赖项之一对同一工件具有传递依赖性,则自动使用 <dependencyManagement>
部分中定义的工件版本.
示例 2
比方说这个神器
<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 覆盖 yourlib 对 morelib 版本 2.0.0 的依赖版本 2.5.2.
结论
针对您的问题,有人在模块 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 的依赖项,模块 A 是模块 B 的依赖项。依赖项管理覆盖了 [ 的版本=78=] 为 5.5.3 。你应该和在你的项目中添加这个 dependencyManagement 配置的人谈谈,他们只希望使用 5.5.3 版本可能是有充分理由的。
文档
在官方 maven 文档中查看更多详细信息here。