一、 Maven的依赖传递
在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。
假设A依赖B,B依赖C,那么我们可以根据maven项目依赖的特征不难推出项目A也依赖C。
- 优点:减少坐标的编写
- 缺点:可能会造成版本冲突
二、如何解决依赖冲突
2.1 依赖调节原则
① 第一声明优先原则
- 在 pom 文件中定义依赖(坐标),谁先声明就用谁
② 路径近者优先原则
- 在pom 文件中定义依赖(坐标),谁的路径近就用谁
2.2 排除依赖
- 通过在pom文件,通过 exclusions 标签排不需要的依赖jar包
2.3 版本锁定
在pom文件中,直接指定项目依赖的所有版本号,导入依赖的时候就不需要指定版本
- properties中定义所有的公共版本号常量
- 通过dependencyManagement锁定版本号:不会导入依赖jar包
- dependencies导入依赖:不需要指定版本号
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.csjava</groupId>
<artifactId>maven-helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
集中声明和管理项目依赖的jar版本信息
-->
<properties>
<spring.version>5.1.5.RELEASE</spring.version>
<junit.version>4.13</junit.version>
</properties>
<!--介绍和演示maven解决jar冲突之:版本锁定 架构师、技术经理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--jar依赖操作 程序猿 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
</project>
三、Maven分模块构建
3.1 什么是分模块构建
在现实生活中,汽车厂家进行汽车生产时,由于整个生产过程非常复杂和繁琐,工作量非常大,所以汽车厂商都会将整个汽车的部件分开生产,最终再将生产好的部件进行组装,形成一台完整的汽车。
在企业项目开发过程中,由于项目规模庞大,业务复杂,参与的人员比较多,一般会通过合理的模块拆分将一个大型的项目拆分为N多个小模块,分别进行开发。而且拆分出的模块可以非常容易的被其他模块复用。
常见的拆分方式有两种:
- 按照业务模块进行拆分,例如将一个项目分为用户模块、订单模块、购物车模块等,每个模块对应就是一个maven工程
- 按照层进行拆分,例如持久层、业务层、表现层等,每个层对应就是一个maven工程不管是上面哪种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一管理和配置。
3.2 maven工程继承
在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。
同样,在maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码。
① 创建父工程
<!--父工程引入坐标-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
</dependencies>
② 创建子(工程)模块
3.3 maven工程聚合
在maven工程的pom.xml文件中可以使用 标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。
注意:继承和聚合本质上没啥关系,通常情况下父工程会聚合管理的子模块(工程)
3.4 创建子模块方式