Maven中的关系
Maven中的关系
继承
一个Maven项目可以继承另一个Maven项目,分别称为子项目、父项目
场景:多个子项目中使用的是相同的依赖或插件,此时可以把相同的配置抽取到一个父项目中,进行统一的管理,保持一致性
步骤:
-
将父项目的打包方式设置为pom
<!-- 打包方式: jar:Java项目的打包方式:默认值 war:Web项目的打包方式 pom:父项目的打包方式--> <packaging>jar</packaging>
-
在子项目中引用父项目,指定父项目的坐标
<!-- 引用父项目,指定父项目的坐标--> <parent> <groupId>org.example</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <!-- 指定父项目的pom.xml文件的相对物理路径--> <relativePath>xx/xx/</relativePath> </parent>
问题:有时并不是父项目的所有依赖都需要被项目继承,但是又希望能够通过父项目对依赖进行统一管理,如版本的控制
解决:使用dependencyManagement标签
步骤:
-
在父项目中配置dependencyManagement
<dependencyManagement> <dependencies> <dependency> <groupId>com.ljy</groupId> <artifactId>mysql..</artifactId> <version>12.52.</version> </dependency> </dependencies> </dependencyManagement>
-
在子项目中引用父项目中的依赖、
<dependencies>
<dependency>
<groupId>com.ljy</groupId>
<artifactId>mysql..</artifactId>
</dependency>
</dependencies>
聚合
将多个子项目添加到一个父项目中,然后通过对父项目进行操作,从而实现对所有聚合的子项目的操作
在父项目的pom中
<!-- 聚合子项目,指定子项目的根目录-->
<modules>
<module>../...</module>
<module>../...</module>
</modules>
依赖(继承)
项目C-->项目B-->项目A
概念:如果项目C依赖于项目B,项目B依赖项目A,则项目C也依赖于项目A,这叫依赖的传递
配置依赖关系:
<!-- 依赖于其他子项目child01-->
<dependency>
<groupId>com.ljy</groupId>
<artifactId>child01</artifactId>
<version>xx</version>
</dependency>
控制依赖的传递
并不是所有的依赖都会被传递
- scope为compile的依赖会传递
- scope为test的依赖不会被传递
- 配置optional为true的依赖不会被传递(不能写在父项目中)
<dependency>
<groupId>com.ljy</groupId>
<artifactId>lof3</artifactId>
<optional>true</optional>
</dependency>
不会出现jar包的冲突
使用Maven不会出现jar包冲突,通过两个原则来保证:
- 就近原则
- 优先定义原则(看是哪个依赖先写,02与01的先后顺序)
<dependency>
<groupId>com.ljy</groupId>
<artifactId>child01</artifactId>
<version>xx</version>
</dependency>
<dependency>
<groupId>com.ljy</groupId>
<artifactId>child02</artifactId>
<version>xx</version>
</dependency>
不要传递的依赖
方式1:在依赖的配置中配置不允许传递
<optional>true</optional>
方式2:在当前的项目中配置不接收传递的特定依赖
<dependency>
<!-- 不接收特定的依赖 -->
<exclusions>
<exclusion>
<groupId>xxx</groupId>
<artifacdId>xxx</artifacdId>
</exclusion>
</exclusions>
</dependency>