【maven笔记】依赖机制

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有以下措施。

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。

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>
 
发布了92 篇原创文章 · 获赞 14 · 访问量 5847

猜你喜欢

转载自blog.csdn.net/sarafina527/article/details/103064993