一、maven简介
1.1 maven的概念和作用
(1)什么是maven
- maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
- POM(project object model):项目对象模型;
- 仓库:用于存储资源,包含各种jar包
- 仓库分类:
- 本地仓库:自己电脑上的存储资源的仓库,连接远程仓库获取资源
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
- 中央仓库:maven团队维护,存储所有资源的仓库
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
- 私服的作用:
- 保存具有版权的资源,包含购买或自主研发的jar(中央仓库中的jar都是开源的)
- 一定范围内共享资源,仅对内部开放,不对外共享。
(2)maven的作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
1.2 maven的下载与安装
(1)maven的下载
(2)maven的安装与环境变量的配置
- maven属于绿色软件,解压即安装
- 依赖Java,需要配置java home的环境变量(已配置)
- 设置maven自身的环境,需要配置MAVEN_HOME
- 测试环境配置结果
1.3 本地仓库与远程仓库的配置
(1)本地仓库的配置
在maven解压后的文件夹下有个conf文件夹,里面有个setting.xml文件,默认指定保存下载的资源到本地仓库是如下标签
<localRepository>${user.home}/.m2/repository</localRepository>
因此要自定义位置,如下代码
<localRepository>自定义位置</localRepository>
(2)远程仓库的配置
maven默认连接的远程仓库位置,是在setting.xml文件下的如下代码
<repositories>
<repository>
<id>唯一 标识符</id>
</repository>
</repositories>
因为直接连接中央仓库,下载的速度很慢,所以要配置aliyun镜像(要把原来的注释掉),如下:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
1.3 依赖管理
(1)依赖配置和依赖传递
依赖配置
- 依赖值当前项目运行所需的jar,一个项目可以设置多个依赖
- 格式如下:
<!--设置当前项目所依赖的所有jar包-->
<dependencies>
<!--设置具体的依赖-->
<dependency>
<!---依赖所属的群组(一般为公司域名倒写)-->
<groupId>junit</groupId>
<!---依赖所属项目id-->
<artifactId>junit</artifactId>
<!--依赖版本号-->
<version></version>
</dependency>
</dependencies>
依赖传递
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖资源的资源如果依赖其他资源,当前项目间接依赖其他的资源
- 依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高;
- 声明优先:当依赖在相同层级时,配置顺序靠前的覆盖配置顺序靠后的。
- 特殊优先:当同级配置了相同的依赖是不同的版本时,后配置的覆盖先配置的。
(2)依赖的控制
可选依赖
- 可选依赖指对外隐藏当前依赖——不透明;
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version></version>
<optional>true</optional>
</dependency>
- 可选依赖指对外隐藏当前依赖——不透明;
排除依赖
- 排除依赖指主动断开依赖,被排除的资源无需指定版本——就是不需要指定的依赖资源
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
- 排除依赖指主动断开依赖,被排除的资源无需指定版本——就是不需要指定的依赖资源
依赖范围
- 依赖的jar默认情况下可以在任何地方使用,可以通过scope标签设定作用范围
- 作用范围:
- 主要程序范围有效(main文件夹下)
- 测试程序范围有效(test文件夹下)
- 是否参与打包(package指令范围内)
| 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 |注:红色字体为直接依赖,黑色字体为间接依赖