前言
前面介绍了MAVEN的基本概念和安装MAVEN基本了解和安装,接下来了解一下MAVEN的依赖管理以及生命周期和插件。
依赖管理
依赖配置
在
<dependencies> </dependencies>里添加即可导入依赖,每个依赖用<dependency></dependency>标签包裹,并且标注出他具体的坐标
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.3</version>
</dependency>
</dependencies>
依赖传递
依赖具有传递性
- 直接依赖:在当前项目中通过
<dependency>直接引入建立的依赖关系- 间接依赖:当前项目引入的
<dependency>中依赖了其他资源,对于当前项目而言相当于间接依赖
依赖传递冲突问题
- 路径优先: 出现相同的资源 层级越深 优先级越低
- 声明优先: 当资源在相同层级被依赖 配置顺序靠前的覆盖配置顺序靠后的
- 特殊优先: 同级配置相同的资源不同版本,后面的覆盖前面的
结合下面这张图,我们来进一步加深理解。
如图所示,当我们项目在层级一依赖了
A1.1版本后在后续的依赖中有相同的依赖,即使版本更高的A1.2,遵循路径优先原则,当前项目会使用A1.1版本的包. 层级二中发现都间接依赖了B的两个版本,遵循声明依赖原则,最终会采用B1.1的版本,以此类推,所以C采用C1.2还有一种特殊情况,当我们不小心在同一级直接依赖的时候引入了两个版本的A时,后面的会覆盖前面的,所以这种情况下会使用A1.2版本。
可选依赖
对外隐藏依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.3</version>
<optional>true</optional>
</dependency>
在当前项目引用的依赖中添加
<optional>true</potional>标签,即可对后续二次依赖本项目的项目隐藏当前依赖,拿上图举例,当A1.1引用B1.1的时候添加了<optional>true</potional>标签,则项目间接依赖中将不再有B1.1的依赖
排除依赖
主动断开依赖资源
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</exclusion>
</exclusions>
</dependency>
当直接引入依赖中有我们不需要的间接依赖,可以通过
<exclusions></exclusions>将其剔除。 和<optional>虽然起到了相同的效果,但是一个是间接依赖有,当前项目主动移除,一个是间接依赖直接隐藏,带都没有带过来。这是二者的本质区别。
依赖范围
我们可以通过
<scope>标签实现依赖的作用范围
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.13</version>
<scope>compile</scope>
</dependency>
作用范围主要分为:
- 主程序范围有效
- 测试范围有效
- 是否参与打包
参考下表
| scope | 主代码 | 测试代码 | 打包 | 范例 |
|---|---|---|---|---|
| compile | Y | Y | Y | log4j |
| test | Y | junit | ||
| provided | Y | Y | servlet-api | |
| runtime | Y | jdbc |
依赖范围的传递性(了解)
带有依赖范围的资源在进行传递时,作用范围将受到影响
- 横着的代表直接依赖
- 竖着的代表间接依赖 | | compile | test | provided | runtime | | :------: | :--: | :--: | :--: | :---------: | | compile | compile | test | provided | runtime | | test | | | | | | provided | | | | | | runtime | runtime | test | provided | runtime |
生命周期与插件
项目构建生命周期
生命周期描述的是一次构建过程中经历了多少事件
主要可大致分为以下三个阶段
- clean: 清理工作
- default: 核心工作,例如编译,测试,打包,部署等
- site:产生报告,发布站点等
注意:生命周期的执行是按顺序向下执行的,意思就是当我们执行了
install的时候,将会自上往下执行clean,test,package直至install,这里还要指出一点,上述只是列出来了一些主要过程,这之中还包含很多细节步骤,感兴趣可自行查阅相关资料。
插件
- 插件与生命周期内的阶段绑定,在执行到对应的生命周期时执行对应的插件功能
- 默认带有各个生命周期的插件,如下图
- 我们也可以更加自己需要添加插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
总结
到这里,我们几乎可以解决所有我们项目中遇到的依赖问题,碰到冲突的时候,可以快速定位出问题所在。