502 Maven-外部依赖

依赖传递

通过在POM中配置<dependencies>标签,可以指定项目依赖的第三方包或者插件,示例:

<dependencies>
  <dependency>
    <groupId>group-a</groupId>
    <artifactId>artifact-a</artifactId>
    <version>1.0</version>
  </dependency>
</dependencies>  

Maven通过依赖传递,可以自动发现项目所有的依赖,A依赖B,B依赖C,C依赖D。在A的POM文件中不需要显示配置对C和D的依赖,Maven能够通过B和C POM文件中的依赖配置自动发现这些依赖关系。

同时,Maven对依赖的层级也没有限制,但需要注意Maven对于重复依赖的处理方式。

假设有两条依赖路线:

  • A -> B -> C -> D 2.0
  • A -> E -> D 1.0

D存在1.0和2.0两个依赖版本,此时Maven会按照以下方式选择D的版本。

  • 最短路径优先。A到D在第一条路线有4层,第二条路线只有三层,因此Maven最终会选择D的1.0版本。
  • 如果路径深度相同,最先声明的优先。

Dependency Management

<dependency management> 一般在多模块项目中使用,定义在所有模块的父POM里,用于集中管理通用的依赖信息,例如版本号,依赖范围。

这样在子POM中就不需要指定父POM里已经定义的信息了,例如下面的例子。

<!-- 父POM -->
<project>
 <modelVersion>4.0.0</modelVersion>
 <groupId>maven</groupId>
 <artifactId>A</artifactId>
 <packaging>pom</packaging>
 <name>A</name>
 <version>1.0</version>
 <dependencyManagement>
   <dependencies>
      <dependency>
        <groupId>test</groupId>
        <artifactId>a</artifactId>
        <version>1.2</version>
      </dependency>
   </dependencies>
 </dependencyManagement> 
</project>  
<!-- 子POM -->
<project>
  <parent>
     <artifactId>A</artifactId>
     <groupId>maven</groupId>
     <version>1.0</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>maven</groupId>
  <artifactId>B</artifactId>
  <name>B</name>
  <version>1.0</version>
  <dependencies>
     <dependency>
       <groupId>test</groupId>
       <artifactId>a</artifactId>
     </dependency>
  </dependencies>
</project> 

<dependencyManagement>与<dependencies>的区别。

  • <dependencyManagement>只是声明依赖,并不实际引入,因此子项目需要通过<dependencies>显示的声明依赖。
  • <dependencies>即使在子项目中不写该依赖项,子项目仍然会从父项目中继承该依赖项。
上篇201 微服务-服务发布和引用
下篇502 Maven-仓库