1.Maven是什么
- Maven是一款服务于Java平台的自动化构建工具.
Make —> Ant —> Maven —> Gradle
构建
- 概念: 以Java源文件, 框架配置文件, JSP ,HTML, 图片等资源为原材料去生产一个i可以运行的项目的过程.
- 编译: Java源文件[User.java] —> 编译 —> Class字节码文件[User.class] —> 交给JVM去执行
- 部署: 一个BS项目最终运行的并不是动态Web工程本身, 而是这个动态Web工程”编译的结果”
- 构建过程中的各个环节
- 1.清理: 将以前编译得到的旧的Class字节码文件删除, 为下一次编译做准备
- 2.编译: 将Java源程序编程为class字节码文件
- 3.测试: 自动测试, 自动调用junit程序
- 4.报告: 测试程序执行的结果
- 5.打包: 动态Web工程打war包, Java工程打jar包
- 6.安装: Maven特定的概念—-将打包得到的文件复制到”仓库”中的指定位置
- 7.部署: 将动态Web工程生产的war包复制到Servlet容器的指定目录下, 使其可以运行
- 概念: 以Java源文件, 框架配置文件, JSP ,HTML, 图片等资源为原材料去生产一个i可以运行的项目的过程.
查找依赖信息的网址: https://mvnrepository.com/
2.Maven核心概念
2.1 目录结构
- 约定的目录结构
Hello //根目录: 工程名
|—-src //源码
|—-|—-main //存放主程序
|—-|—-|—-java //存放Java源文件
|—-|—-|—-resources //存放框架或者其他工具的配置文件
|—-|—-test //存放测试程序
|—-|—-|—-java
|—-|—-|—-resources
|—-pom.xml //Maven工程的核心配置文件
2.2 POM
- 含义: Preject Object Model 项目对象模型
pom.xml对于Maven工程是核心配置文件, 与构建过程相关的一切设置都在这个文件中进行配置.
2.3 坐标
数学中的坐标
- 在平面上, 使用 x,y,两个向量可以唯一定义平面中的任何一点
- 在空间中, 使用 x,y,z三个向量可以唯一定位空间中的任何一个点
- Maven的坐标
- 使用下面三个向量在仓库中唯一定位一个Maven工程
- groupid: 公司或组织域名倒序 + 项目名
- 使用下面三个向量在仓库中唯一定位一个Maven工程
<groupid>com.yuque.maven</groupid>
- artifactid: 模块名
<artifactid>Hello</artifactid>
- version: 版本
<version>1.0.0</version>
- Maven工程的坐标与仓库中路径的对应关系

2.4 仓库
- 仓库的分类
- 本地仓库: 为当前本地电脑上的所有Maven工程服务
- 远程仓库:
- 私服: 架设在当前局域网环境下, 为当前局域网范围内的所有Maven工程服务
- 中央仓库: 架设在Internet上,为全世界所有Maven工程服务
- 中央仓库镜像: 为了分担中央仓库的流量, 提升用户访问速度
- 仓库中保存的内容: Maven工程
- Maven自身所需要的插件
- 第三方框架或工具的jar包
- 我们自己开发的Maven工程
2.5 依赖(重要)
- Maven解析依赖信息时,会到本地仓库中查找被依赖的jar包
对于我们自己开发的Maven工程, 使用mvn install命令i安装后就可以进入仓库
- 依赖的范围

1.compile范围依赖
- 对主程序是否有效: 有效
- 对测试程序是否有效: 有效
是否参与打包: 参与

2.test范围依赖
- 对主程序是否有效: 无效
- 对测试程序是否有效: 有效
- 是否参与打包: 不参与
- 典型例子: junit
- 3.provided:范围依赖
- 对主程序是否有效: 有效
- 对测试程序是否有效: 有效
- 是否参与打包: 不参与
- 是否参与部署: 不参与
- 典型例子: servlet-api.jar

- 依赖的传递性

- 好处: 可以传递的依赖不必在每个模块工程中都重复声明, 在’’最下面”的工程中依赖一次即可.
- 注意: 非compile范围的依赖不能传递. 所以在各个工程模块中, 如果有需要旧的重复声明依赖.
依赖的排除
需要设置依赖排除的场合

依赖排除的设置方式

依赖的原则
- 作用: 解决模块工程之间的jar包冲突问题
1.路径最短者优先原则

2.路径相同时, 先声明者优先(指dependency标签的声明顺序)

统一管理版本号 ```xml //声明
1.8 UTF-8 4.3.4.RELEASE
//引用
<a name="uNLnZ"></a>
### 2.6 生命周期/插件/目标
- 各个构建环节执行的顺序: 不能打乱顺序, 必须按照既定的正确顺序执行
- Maven的核心程序中定义了抽象的生命周期, 生命周期中各个阶段的具体任务是由插件来完成的
- Maven核心程序为了更好的实现自动化构建, 按照这一的特点执行生命周期中的各个阶段: 不论当前要执行生命周期中的哪一个阶段, 都是从这个生命周期最初的位置开始执行.
<a name="WRVWG"></a>
### 2.7 继承
- 现状
Hello依赖的junit: 4.0<br />HelloFriend依赖的junit: 4.0<br />MakeFriends依赖的junit: 4.9<br />由于**test**范围的依赖不能传递, 所以必然会分散在各个模块工程中, 很容易造成版本不一致.
- 需求: 统一管理各个模块工程中对junit依赖的版本
- 解决思路: 将junit依赖统一提取到"父"工程中, 在子工程中声明junit依赖时不指定版本, 以父工程中统一设定的为准
- 操作步骤
- 1. 创建一个Maven工程为父工程. 注意: 打包的范围为**pom**
** **
- 2. 在子工程中声明对父工程的引用

- 3.将子工程的坐标中与父工程坐标中重复的内容删除

- 4.在父工程中统一管理junit的依赖

- 5.在子工程中删除junit依赖的版本号部分

> - 注意: 配置继承后,执行安装命令时要先安装父工程
<a name="FyCiX"></a>
### 2.8 聚合
- 作用: 一键安装各个模块工程
- 配置方式: 在一个"总的聚合工程"中配置各个参与聚合的模块

---
<a name="RZ6Ir"></a>
## 3.Maven常用命令
maven有一套管理项目结构的命令,每一个命令都是一个插件<br />**1、mvn clean**:清除所有编译的代码<br />**2、mvn compile:**编译主程序/src/main/java下的代码,放在target目录下<br />**3、mvn test:**编译测试程序,包括test测试代码,放在target目录下<br />**4、****mvn package**:打包,包括test测试代码,同时生成war/jar包,放在target目录下<br />**5、mvn install:**编译所有代码,包括test测试代码,同时生成war/jar包,放在target目录下;同时将项目安装到本地仓库中
> 关于联网问题
> 1.Maven的核心程序中仅仅定义了抽象的生命周期, 但具体工作必须由特定的插件来完成. 而插件本身并不包含在Maven的核心程序中.
> 2.当执行Maven命令需要用到某些插件时,Maven核心程序首先到本地仓库中查找
> 3.本地仓库的默认位置: [系统中当前用户的家目录] \.m2\repository
> 4.Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网, 到中仓库下载.
> 5.如果此时无法连接外网, 则构建失败.
> 6.修改默认仓库的位置
> 1.找到Maven解压目录\conf\settings.xml
> 2.在settings.xml文件中找到localRepository标签
> 3.将<localRepository>/path/to/local/repo</localRepository> 从注释中取出
> 4.将标签体内容修改为已经准备好的Maven仓库
> 如:<localRepository>D:\RepMaven</localRepository>
---
<a name="gY8cT"></a>
## 4.操作与配置
<a name="wzUq1"></a>
### 4.1、maven安装
**windows版本**<br /><br /><br /><br />
mac版本<br />1,下载地址:[http://maven.apache.org/download.cgi](http://maven.apache.org/download.cgi)<br />2,
3,点击下载解压后,将文件夹复制到/usr/local下面<br />4,打开终端,输入`vim ~/.bash_profile` (path环境配置的文件) 按i进入编辑模式<br />5,将下面两句拷贝到文件内
```bash
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
添加完之后,按esc,执行:wq保存退出
6.执行 source ~/.bash_profile 为配置环境变量生效
7.测试 mvn -v 查看是否出现maven版本
4.2、仓库配置

settings.xml//配置阿里云镜像,修改本地maven仓库等
4.3、IDEA配置


-DarchetypeCatalog=internal
4.4、使用骨架
4.5、不用骨架
开发中推荐不使用骨架创建maven项目
4.6、多模块管理:方式1
大型项目project需要分模块mudule管理。以下是maven多模块管理的测试案例一。
(1)创建空项目(project)
(2)创建parent模块(module)

(3)创建child模块(mudule)


(4)统一管理依赖
1、父类中的依赖子类会无条件继承 2、使用dependencyManagement标签强制管理依赖

(5)获取指定依赖
子模块声明需要继承的依赖,不用写version

(6)管理版本号
maven管理依赖最终的目的就是管理版本号,parent一改全部跟着改

pom.xml(parent的pom.xml文件)
(7)项目结构
4.7、多模块管理:方式2
(1)创建parent工程
创建好之后同样需要删除src目录,添加packing标签,标签值为pom
(2)创建child工程


其他操作,如管理依赖、管理版本号、继承指定版本号这些和方式1一致
4.8、调整编译版本
方式1:IDEA设置;当pom文件变化时,jdk版本还是会变成1.5

方式2:在pom文件配置jdk编译插件的版本,这样,当pom文件引入新的依赖,也不会改变jdk的版本
<build>
<plugins>
<plugin>
<!-- jdk1.8编译插件 -->
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3.9</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
4.9SNAPSHOT版本时, 开启always update






