Maven核心概念详解(依赖管理、依赖范围、maven仓库、插件)
maven的核心概念
一、不同依赖范围对传递依赖的影响
| 依赖范围(Scope) | 对于主代码classpath有效 | 对于测试代码classpath有效 | 被打包,对于运行时classpath有效 | 例子 |
|---|---|---|---|---|
| compile | Y | Y | Y | log4j |
| test | - | Y | - | junit |
| provided | Y | Y | - | servlet-api |
| runtime | - | - | Y | JDBC Driver Implementation |
二、maven依赖配置
1.传递性依赖和可选依赖,排除依赖
依赖范围
依赖范围scope用于控制依赖和编译,测试,运行的classpath的关系,三者的关系如下:
- compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
- test:测试依赖范围。只对于测试classpath有效
- provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
- runtime:运行时的依赖范围,对于运行的classpath都有效。例如:jdbc驱动
maven坐标
例如
<dependencies>
<!--在ebuy-2的项目中引用了ebuy-1-->
<dependency>
<groupId>cn.ebuy</groupId>
<artifactId>ebuy-1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
测试
创建项目
- 首先建设一个maven项目,建设结构如下
- 建好之后的目录结构如下

引用项目
- 然后在ebuy-1的项目下通过maven方式引入一个jar包
- 然后在ebuy-2的项目下引入ebuy-项目,如图

测试
- 测试ebuy-1的项目对jar包设置不同scope,分别对ebuy-2的项目不同的影响
示例:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
<!--默认的范围-->
<scope>compile</scope>
<!--true表示引用该项目的子项目不能使用当前的JAR包-->
<!--也就是说ebuy-2不能使用ebuy-1的这个jar包-->
<optional>true</optional>
</dependency>
完成以上设置之后测试

maven的依赖排除
用途1:
疑问:为什么要排除
我想在ebuy-2的项目下使用mysql5的驱动,但是我引用的ebuy-1使用的mysql8的驱动,如果我直接在ebuy-2的项目下,导入mysql5的jar包可能会报错之类的
如图

解决:

用途2:
提出疑问:我在ebuy-1项目下的log4j的jar包,不想让ebuy-1项目获取
回答一:那你直接设置这个jar包的optional设置为true不传递,不就行了吗!
疑问者:但是我想让ebuy-3能够获得这个jar包啊,设置optional就是所有的项目都不能获取到了啊
那么该如何解决呢?
解决:
- 在ebuy-2(不需要ebuy-1的jar的项目)的项目下添加排除

总结:
作用:可以排除某些我们不需要的jar包
三、maven仓库
什么是maven仓库
- 用于统一存储所有Maven共享构建的位置就是maven仓库
maven仓库布局
- 根据Maven坐标定义每个构建在仓库中唯一存储路径
仓库的分类
- 本地仓库
- ~/.m2/repository/
- 每个用户只有一个本地仓库
- 远程仓库
- 中央仓库:Maven:Maven默认的远程仓库
- 私服:是一种特殊的远程仓库。它是架构在局域网内的仓库
四、Maven的插件
- Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的
- 每个插件都能实现多个功能,每个功能都是一个插件目标
- Maven的生命周期与插件目标相互绑定,已完成某个具体的构建目标
例如complie就是插件 maven-complie-plugin的一个插件目标

浙公网安备 33010602011771号