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容器的指定目录下, 使其可以运行
  • 查找依赖信息的网址: 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: 公司或组织域名倒序 + 项目名

<groupid>com.yuque.maven</groupid>

  1. - artifactid: 模块名

<artifactid>Hello</artifactid>

  - version: 版本

<version>1.0.0</version>

  • Maven工程的坐标与仓库中路径的对应关系

image.png

2.4 仓库

  • 仓库的分类
    • 本地仓库: 为当前本地电脑上的所有Maven工程服务
    • 远程仓库:
      • 私服: 架设在当前局域网环境下, 为当前局域网范围内的所有Maven工程服务
      • 中央仓库: 架设在Internet上,为全世界所有Maven工程服务
      • 中央仓库镜像: 为了分担中央仓库的流量, 提升用户访问速度
  • 仓库中保存的内容: Maven工程
    • Maven自身所需要的插件
    • 第三方框架或工具的jar包
    • 我们自己开发的Maven工程

2.5 依赖(重要)

  • Maven解析依赖信息时,会到本地仓库中查找被依赖的jar包

对于我们自己开发的Maven工程, 使用mvn install命令i安装后就可以进入仓库

  • 依赖的范围

image.png

  • 1.compile范围依赖

    • 对主程序是否有效: 有效
    • 对测试程序是否有效: 有效
    • 是否参与打包: 参与

       ![image.png](https://cdn.nlark.com/yuque/0/2020/png/153889/1596727580602-a1ce59ac-c3a7-4c0a-af75-38c6c8198e05.png#align=left&display=inline&height=162&margin=%5Bobject%20Object%5D&name=image.png&originHeight=440&originWidth=657&size=99217&status=done&style=none&width=242)
      
  • 2.test范围依赖

    • 对主程序是否有效: 无效
    • 对测试程序是否有效: 有效
    • 是否参与打包: 不参与
    • 典型例子: junit
  • 3.provided:范围依赖
    • 对主程序是否有效: 有效
    • 对测试程序是否有效: 有效
    • 是否参与打包: 不参与
    • 是否参与部署: 不参与
    • 典型例子: servlet-api.jar
  • image.png
    • 依赖的传递性

image.png

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

    • 需要设置依赖排除的场合

      image.png

    • 依赖排除的设置方式

      ![image.png](https://cdn.nlark.com/yuque/0/2020/png/153889/1596769387713-d534d8bd-5d88-4826-9af8-8700d105c91f.png#align=left&display=inline&height=121&margin=%5Bobject%20Object%5D&name=image.png&originHeight=241&originWidth=756&size=111899&status=done&style=none&width=378)
      
  • 依赖的原则

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

      image.png

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

      image.png

  • 统一管理版本号 ```xml //声明

    1.8 UTF-8 4.3.4.RELEASE

//引用

org.springframework spring-core ${spring.version}


<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**

**             ![image.png](https://cdn.nlark.com/yuque/0/2020/png/153889/1596788497743-c9cfa369-5e55-4cfa-90cb-64dcbd707876.png#align=left&display=inline&height=80&margin=%5Bobject%20Object%5D&name=image.png&originHeight=160&originWidth=487&size=78587&status=done&style=none&width=243.5)**

   - 2. 在子工程中声明对父工程的引用

            ![image.png](https://cdn.nlark.com/yuque/0/2020/png/153889/1596788533420-2215ae7e-5c11-4563-8e1f-c4dcd021164d.png#align=left&display=inline&height=159&margin=%5Bobject%20Object%5D&name=image.png&originHeight=317&originWidth=712&size=176725&status=done&style=none&width=356)

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

![image.png](https://cdn.nlark.com/yuque/0/2020/png/153889/1596788417087-173a4a5f-64c8-4c11-98eb-e1533cd91dd2.png#align=left&display=inline&height=81&margin=%5Bobject%20Object%5D&name=image.png&originHeight=161&originWidth=738&size=76707&status=done&style=none&width=369)

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

      ![image.png](https://cdn.nlark.com/yuque/0/2020/png/153889/1596788466865-738155c5-ab4a-4eea-9a73-a4a6e18c61c3.png#align=left&display=inline&height=183&margin=%5Bobject%20Object%5D&name=image.png&originHeight=365&originWidth=556&size=160117&status=done&style=none&width=278)

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

            ![image.png](https://cdn.nlark.com/yuque/0/2020/png/153889/1596788643037-d05b04f6-01b0-4e3e-8dbc-3792c7206da4.png#align=left&display=inline&height=97&margin=%5Bobject%20Object%5D&name=image.png&originHeight=193&originWidth=747&size=88506&status=done&style=none&width=373.5)
>    - 注意: 配置继承后,执行安装命令时要先安装父工程


<a name="FyCiX"></a>
### 2.8 聚合

- 作用: 一键安装各个模块工程
- 配置方式:  在一个"总的聚合工程"中配置各个参与聚合的模块

            ![image.png](https://cdn.nlark.com/yuque/0/2020/png/153889/1596789123870-63cd39e2-b5ec-4d29-94f0-e7948c0bb040.png#align=left&display=inline&height=149&margin=%5Bobject%20Object%5D&name=image.png&originHeight=297&originWidth=616&size=139094&status=done&style=none&width=308)

---

<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 />![image.png](https://cdn.nlark.com/yuque/0/2020/png/750382/1590462182612-6397eebc-d9fc-453a-83f6-008e9591283c.png#align=left&display=inline&height=440&margin=%5Bobject%20Object%5D&name=image.png&originHeight=879&originWidth=1908&size=210480&status=done&style=none&width=954)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/750382/1590462225732-31ad500f-fb32-42cd-801c-b0e02d2cf144.png#align=left&display=inline&height=109&margin=%5Bobject%20Object%5D&name=image.png&originHeight=217&originWidth=839&size=16244&status=done&style=none&width=419.5)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/750382/1590462268785-a923fa75-c203-4e3d-a22f-a2386f91bcb6.png#align=left&display=inline&height=332&margin=%5Bobject%20Object%5D&name=image.png&originHeight=664&originWidth=677&size=67981&status=done&style=none&width=338.5)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/750382/1590462285129-e3ed8555-b980-4cd7-8599-947485113265.png#align=left&display=inline&height=320&margin=%5Bobject%20Object%5D&name=image.png&originHeight=639&originWidth=1223&size=60724&status=done&style=none&width=611.5)


mac版本<br />1,下载地址:[http://maven.apache.org/download.cgi](http://maven.apache.org/download.cgi)<br />2,![image.png](https://cdn.nlark.com/yuque/0/2021/png/153889/1611554473337-c338477b-69c9-4ee2-a815-00aa6eca7ab5.png#align=left&display=inline&height=458&margin=%5Bobject%20Object%5D&name=image.png&originHeight=458&originWidth=1168&size=429823&status=done&style=none&width=1168)

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版本
image.png

4.2、仓库配置

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

4.3、IDEA配置

image.png
image.png

-DarchetypeCatalog=internal

4.4、使用骨架

java项目
image.pngimage.png
image.png
image.png
image.png
web项目
image.png
image.png

4.5、不用骨架

开发中推荐不使用骨架创建maven项目

image.png

4.6、多模块管理:方式1

大型项目project需要分模块mudule管理。以下是maven多模块管理的测试案例一。

(1)创建空项目(project)
image.png
(2)创建parent模块(module)
image.png
image.png
(3)创建child模块(mudule)
image.png
image.png
image.png
(4)统一管理依赖

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

image.png
(5)获取指定依赖

子模块声明需要继承的依赖,不用写version

image.png
(6)管理版本号

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

image.png
pom.xml(parent的pom.xml文件)
(7)项目结构
image.png

4.7、多模块管理:方式2

(1)创建parent工程
创建好之后同样需要删除src目录,添加packing标签,标签值为pom
image.png
(2)创建child工程
image.png
image.png
image.png
其他操作,如管理依赖、管理版本号、继承指定版本号这些和方式1一致

4.8、调整编译版本

方式1:IDEA设置;当pom文件变化时,jdk版本还是会变成1.5

image.png

方式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
image.png