欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【maven笔记】依赖机制

程序员文章站 2022-07-15 09:50:01
...

0.引言

mavan的依赖机制包含依赖传递、依赖范围、依赖管理(导入)和系统依赖

1.依赖传递

所谓传递就是 你的项目A依赖一个构件B,B依赖构件C和D,你的项目A也会依赖项目C和D。

如你的项目生命的POM文件如下,wy-app依赖了spring-context,

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.wy.app</groupId>
  <artifactId>wy-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>wy-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>1.2.6</version>
    </dependency>
  </dependencies>
</project>

用mvn dependency:tree分析可得

【maven笔记】依赖机制【maven笔记】依赖机制

由于依赖传递没有层次限制,引发了一系列问题,如循环依赖、多版本冲突等等,为了解决这些问题,maven有以下措施。

1.1 依赖仲裁

当在dependencies元素下添加一个依赖spring-core,且与传递的依赖版本不同时,maven有着自己的仲裁机制。

<dependency>
  <groupId>springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>1.2.3</version>
</dependency>

依赖仲裁就是在同个构件有多个版本时,选择构件的其中一个版本。

规则:

  • 依赖树 层次上离根最近的,层次相同,选择先声明的。

如下图,由于声明了一个不同版本的spring-core:1.2.3,由于这个离根更更近,所以忽略了从spring-context传递而来的spring-core:1.2.6。

【maven笔记】依赖机制【maven笔记】依赖机制

2.依赖管理

依赖管理dependencyManagement块 集中化管理依赖版本,当项目包含多个模块,有很多相同的依赖,可以抽象出一个parent POM,父pom文件中可以声明依赖如下,而子模块就可以使用根据groupId-artifactId引用该声明,可以统一管理多个模块的依赖版本。

<dependencyManagement>
	<dependencies>
	  <dependency>
	    <groupId>springframework</groupId>
	    <artifactId>spring-core</artifactId>
	    <version>1.2.3</version>
	  </dependency>
	</dependencies>
....
</dependencyManagement>

<!-- 子模块-->
<dependencies>
  <dependency>
    <groupId>springframework</groupId>
    <artifactId>spring-core</artifactId>
  </dependency>
...
</dependencies>