目录
[第二步。在的对应jar的中使用"{}"引入上面定义好的版本。](#第二步。在的对应jar的中使用"{}"引入上面定义好的版本。)
- 本篇博客的内容是涉及Maven的高级特性。
- Maven的高级特性(模块化、聚合、依赖管理)。本篇博客的主要内容是偏向于Maven的依赖管理。
一、Maven的依赖版本维护。
(1)为什么需要依赖版本维护?
- Maven是一个项目管理工具。主要作用是在项目开发阶段对项目进行依赖管理和项目构建以及管理插件。
- POM(Project Object Model)指的是项目对象模型,用来描述当前的Maven项目。它是Maven项目的核心文件。Maven项目的所有依赖都是添加到pom.xml文件里面。
- 如果pom.xml文件中引入的依赖太多,而各种依赖又有不同的版本。
- 为了统一维护版本!可以将所有依赖的版本号取出来进行统一管理。具体操作步骤如下。
(2)依赖统一管理的具体操作步骤。
- 这里使用javax.servlet包下的servlet-api进行演示操作。
- 先去Maven中央仓库寻找到指定的jar包。
- 直接复制坐标并引入pom.xml文件。
- servlet-api2.5坐标
XML<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>
第一步。在pom.xml文件中使用<properties>标签定义jar包的版本。
XML<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--指定servlet-api版本号--> <servlet-api.version>2.5</servlet-api.version> </properties>
第二步。在<dependency>的对应jar的<version>中使用"${}"引入上面定义好的版本。
XML<!--添加依赖--> <dependencies> <!--javax.servlet/servlet-api依赖--> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet-api.version}</version> <scope>provided</scope> </dependency> </dependencies>
- 刷新Maven。查看已添加的依赖!
二、Maven的依赖传递。
(1)什么是Maven依赖传递?
- 简单的讲:依赖传递就是当我们在项目中引入某个jar包时,所引入的jar包所依赖的jar包也会跟着传递并一起引入进来。
- 在Maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。
(2)Maven依赖传递引发的问题。
- 通过下面图可以看到。当我们的web项目直接依赖了spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans、spring-core等。
- 最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans、spring-core等。
- 问题:如果我项目需要的spring-core的jar版本不是间接依赖的版本6.2.0。而是需要直接导入指定版本6.1.12该如何解决?
- 它们之间一起导入的会冲突吗?还是通过其他的方法去解决依赖冲突的问题?下面接着讨论如何解决依赖传递引发的依赖冲突问题!
三、解决Maven依赖传递导致的依赖冲突问题。
(1)什么是Maven依赖冲突?
- 在项目中同时依赖了多个相同作用的jar。比如spring-aop : 5.0.2和spring-aop : 5.0.5。
- 当使用Maven引入了Servlet的jar包。且不写<scope>provided</scope>这一行标签。
XML<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency>
- 当我们把项目部署到tomcat服务器上时,就会报引入的jar包冲突问题!
- 因为在Tomcat服务器中已经内置了servlet的jar包。所以我们就得给javax.servlet的依赖作用范围设置为provided。表示依赖范围到打包部署为止,这样就能解决这个冲突。
(2)解决依赖冲突的3种方法。
方法1。Maven自提供的调解原则。(自动)
- 第一声明者优先原则!该原则用于:依赖间接传递jar包之间。在pom.xml文件中,先声明哪个jar包,就以那个jar包为主。
- 路径近者优先原则!Maven会优先使用自己导入的jar包。依赖中间接传递的jar包排其次 直接依赖高于间接依赖。
方法2。排除依赖------排除依赖间接传递jar包。
- 在对应的jar包的<dependency>内使用<exclusions>与<exclusion>进行排除指定依赖传递的jar包。
- 这里拿前面项目pom文件直接引入spring-webmvc依赖时,间接引入依赖spring-core举例。我排除指定的传递依赖(spring-core),再重新指定其版本为6.1.12。
XML<!--添加依赖--> <dependencies> <!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.2.0</version> <!--排除该依赖--> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency> <!--排除后再使用6.1.12spring-core--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>6.1.12</version> </dependency> </dependencies>
方法3。锁定指定jar包的版本。
- 使用标签<dependencyManagement>指定某个jar包的版本是什么。即将jar包版本锁定。但是注意还是需要在<dependencies>与<dependency>内引入依赖,但可以不需要再指定其版本!
XML<!--依赖管理--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>6.1.12</version> </dependency> </dependencies> </dependencyManagement> <!--添加依赖--> <dependencies> <!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.2.0</version> </dependency> <!--使用6.1.12spring-core--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> </dependencies>