02.Maven 的核心概念
1.Maven 目录结构
bash
目录结构
Hello 工程名
|---src 源码
|---|---main 放主程序
|---|---|---java 存放java源文件
|---|---|---resources 存放框架或其他工具的配置文件
|---|---test 存放测试程序
|---|---|---java 存放java源文件
|---|---|---resources 存放框架或其他工具的配置文件
|---pom.xml Maven的核心配置文件
2.Maven 常用命令
- mvn clean:将 target 目录删除,但是已经 install 到仓库里的包不会删除
- mvn compile:编译主程序
- mvn test-compile:编译测试程序
- mvn test:执行测试
- mvn package:打包
- mvn install:安装
- mvn deploy:部署、生成站点
3.maven 工程对 jar 包的管理过程
- ①Maven 的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在 Maven 的核心程序中。
- ② 当我们执行的 Maven 命令需要用到某些插件时, Maven 核心程序会首先到本地仓库中查找。
- ③ 本地仓库的默认位置: C:\USERS\USERNAME
\
.m2\repository - ④Maven 核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载
- ⑤ 如果此时无法连接外网,则构建失败。
- ⑥ 修改默认本地仓库的位置可以让 Maven 核心程序到我们事先准备好的目录下查找插件
- [1]找到 Maven 解压目录\confsettings.xml
- [2]在 settings.xm|文件中找到 localRepository 标签
- [3]将
<localRepository>
/path/to/local/repo</localRepository
>从注释中取出 - [4]将标签体内容修改为已经准备好的 Maven 仓库目录
4.POM
Project Object Model 项目对象模型
DOM Document Object Model 文档对象模型
pom.xml 对于 Maven 工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。重要程度相当于 web.xm|对于动态 Web 工程
5.坐标 gav
- 数学中的坐标:
- 在平面上,使用 x、y 两个向量可以唯一的定位平面中的任何一个点
- 在空间上,使用 x、y、z 三个向量可以唯一的定位空间中的任何一个点
- Maven 的坐标
- 使用三个向量在仓库中唯一定位一个 Maven 工程
- groupid:公司或组织域名的倒序+项目名
- 使用三个向量在仓库中唯一定位一个 Maven 工程
java
com.baidu.projectname
- artifactid:模块名
- version:版本
- Maven 工程的坐标与仓库中路径的对应关系
xml
<groupId> org.springframework </groupId>
<artifactId> spring-core </artifactId>
<version>4.0.0.RELEASE </version>
bash
org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar
仓库 repository
- 仓库的分类
- 本地仓库:当前电脑上部署的仓库目录,为当前电脑上多有 Maven 工程服务
- 远程仓库
- 私服:搭建在局域网环境中,为局域网范围内的所有 Maven 工程服务
- 中央仓库:架设在Internet上,为全世界所有Maven工程服务
- 中央仓库镜像:为了分担中央仓库的流量,提升用户访问速度
- 仓库中保存的内容:Maven 工程
- Maven 自身所需的插件
- 第三方框架或工具的 jar 包
- 自己开发的 Maven 工程
6.依赖【初步】
- Maven 解析依赖信息时会到本地仓库中查找被依赖的 jar 包。对于我们自己开发的 Maven 工程,使用 mvn install 命令安装后就可以进入仓库。
- 依赖的范围
- compile 范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:参与
- 是否参与部署:参与
- 典型例子:spring-core
- test 范围依赖
- 对主程序是否有效:无效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- 典型例子:junit
- provided 范围依赖 - 对主程序是否有效:有效 - 对测试程序是否有效:有效 - 是否参与打包:不参与 - 是否参与部署:不参与 - 典型例子:servlet-api.jar
- compile 范围依赖
7.生命周期
- 各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行
- Maven 的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的
- Maven 核心程序为了更好的实现自动化构建,按照这一的特点执行生命周期中的各个阶段:不论现在要执行生命周期中的哪一个阶段,都是从这个生命周期最初的位置开始执行
例如:
7.1 插件与目标
- 生命周期的各个阶段仅仅定义了要执行的任务是什么
- 各个阶段和插件的目标是对应的
- 相似的日标由特定的插件来完成
- 可以将目标看作”调用插件功能的命令“
8.依赖【高级】
- 依赖的传递性
好处:可以传递的依赖不必在每个模块工程中都重复声明,在”最下面”的工程中依赖-次即可。
注意:非 compile 范围的依赖不能传递。所以在各个工程模块中,如果有需要就得重复声明依赖。
- 依赖的排除
- 需要设置依赖排除的场合
- 依赖排除的设置方式
- 需要设置依赖排除的场合
xml
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
- 依赖的原则
- 作用:解决模块工程之间的 jar 包冲突问题
- 情景设定一:验证路径最短者优先原则
- 情景设定二:验证路径相同时先声明者优先
- 统一管理依赖的版本
- 情景举例
- 情景举例
这里需要对 spring 各个 jar 包的依赖版本进行管理,如需要升级到 4.1.1
- 配置方式
- 使用 properties 标签内使用自定义标签统一声明版本号
xml
<properties>
<cvzhanshi.spring.version>4.0.0.RELEASE</cvzhanshi.spring.version>
</properties>
- 在需要统一版本的位置,使用${自定义标签名}引用声明的版本号
xml
<version>${cvzhanshi.spring.versio}</version>
- 其实 properties 标签配合自定义标签声明数据的配置并不是只能用于声明依赖的版本号。凡是需要统一声明后再弓|用的场合都可以使用
xml
<properties>
<cvzhanshi.spring.version>4.0.0.RELEASE</cvzhanshi.spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
9.继承
- 现状
- 需求:统一管理各个模块工程中对 junit 依赖的版本
- 解决思路:将 junit 依赖统一提取到“父”工程中,在子工程中声明 junit 依赖时不指定版本,以父工程中统一设定的为准。同时也便于修改
- 操作步骤
- 创建一个 Maven 工程作为父工程。注意:打包的方式为 pom
xml
<groupId>com.cvzhanshi.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
- 在子工程中声明对父工程的引用
xml
<!-- 子工程中声明父工程 -->
<parent>
<groupId>com.cvzhanshi.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 以当前文件为基准的父工程pom.xml文件的相对路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
- 将子工程的坐标中与父工程坐标中重复的内容删除
- 在父工程中统一管理 junit 的依赖
xml
<!-- 配置依赖的管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 在子工程中删除 junit 依赖的版本号部分
- 注意:配置继承后,执行安装命令时要先安装父工程
10.聚合
- 作用:一键安装各个模块工程
- 配置方式:在一个”总的聚合工程“中配置各个参与聚合的模块
xml
<!-- 配置聚合 -->
<modules>
<!-- 指定各个子工程的相对路径 -->
<module>../HelloFriend</module>
<module>../MakeFriends</module>
<module>../Hello</module>
</modules>
- 使用方式:在聚合工程的 pom.xml 上点右键->run as->maven install(eclipse 中)