maven依赖:树日志:版本1编译(版本从版本2管理)

刘同彬*_*刘同彬 4 java maven solrj

  1. 我遇到了依赖关系的问题:树。困扰了我几天。我在名为 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版本?

  4. 1

2

pic1是我用idea来展示依赖关系。pic2是我点击solrj跳转到pom.xml。

ilo*_*ner 7

模块 B 的 pom 或模块 B 的父 pom 包含一个<dependencyManagement>部分。maven 中使用依赖管理来集中 jar 所使用的版本。它可能会覆盖您定义的solr-solrj版本 5.5.3。依赖管理主要通过两种方式发挥作用。您可能正在经历第 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>
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 。

2. 覆盖传递依赖的版本。

如果您在您的代码中定义了一个工件版本,并且您的依赖项之一对同一工件具有传递依赖关系,则将自动使用<dependencyManagement>您的部分中定义的工件版本。<dependencyManagement>

实施例2

就说这个神器

<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 文档了解更多详细信息。