maven dependency:tree 日志:版本 1 编译(版本从版本 2 管理)

maven dependency:tree log: version1 compile (version managed from version2)

  1. 我遇到了 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>

  2. 另一个名为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依赖。

  3. 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 覆盖 yourlibmorelib 版本 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