1. Maven基础概念和配置
Maven是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
1.1 Maven能解决的问题
- 依赖管理
 - 编译代码
 - 单元测试
 - 打包项目
 
1.2 安装与配置
1.2.1 官网下载Maven
官网下载链接
点击apache-maven-3.6.1-bin.zip下载

1.2.2 解压

1.2.3 配置环境变量
注意:安装maven之前,确保电脑中已安装JDK,如安装Maven3则必须是JDK1.7以上。
新建一个系统变量,变量名:MAVEN_HOME,变量值为你解压的文件路径,例我的路径是:D:\Maven\apache-maven-3.6.1

添加到系统路径中:

完成后打开cmd输入mvn -v,显示版本信息则配置正确。

1.3 本地仓库配置
仓库分三类:本地仓库,远程仓库[私服],中央仓库。
- 本地仓库:用于存储从远程仓库或中央仓库下载的插件和jar包,项目使用的一些插件或jar包。优先从本地仓库查找,默认本地仓库位置在
${user.home}/.m2/repository,${user.home}表示windows用户目录。 
在maven的conf文件夹下的settings.xml文件中配置本地仓库。

- 远程仓库:又叫私服仓库,如果私服仓库存在,且在本地仓库所需的插件或jar包没有的情况下,会从当前仓库下载。
 - 中央仓库:在maven软件中内置一个远程仓库地址
http://repo1.maven.org/maven2。它是中央仓库(Central Repository),服务于整个互联网,由Maven官方团队维护,里面存储了非常全面的jar包,包含了世界上大部分主流的开源项目构件。 
2. Maven工程的认识
2.1 Maven工程的目录结构
- 工程目录结构:
 

作为一个Maven工程,它的src目录和pom.xml是必备的。
target:项目输出位置,编译后的class文件会输出到此目录。pom.xml:maven项目核心配置文件。src目录结构:

标准
src目录结构:src/main/java:存放项目的.java文件。src/main/resources:存放项目资源文件,如spring,hibernate配置文件。src/test/java:存放所有单元测试.java文件,如Junit测试类。src/test/resources:测试资源文件。
- 运行项目:进入maven工程目录(当前目录有
pom.xml),打开cmd,运行mvn tomcat:run命令即可。 
3. Maven常用命令
我们可以在cmd中通过一系列的maven命令来对我们的maven工程进行编译、测试、运行、打包、安装、部署。
3.1 compile
compile是maven工程的编译命令,作用是将src/main/java下的文件编译为class文件输出到target目录下。
3.2 test
test是maven工程的测试命令,执行mvn test命令,会执行src/test/java下的单元测试类。
3.3 clean
clean是maven工程的清理命令,执行mvn clean命令会删除target目录及内容。
3.4 package
package是maven工程的打包命令,对于java工程执行该命令会打包成jar包,web工程则会打包成war包。
3.5 install
install是maven工程的安装命令,执行该命令会将maven打包成jar包或war包发布到本地仓库。
3.6 Maven指令的生命周期
maven对项目构建过程分为三套相互独立的生命周期,请注意是三套且相互独立的。
这三套生命周期分别是:
Clean Lifecycle:在进行真正的构建之前进行一些清理工作。Default Lifecycle:构建的核心部分,进行编译、测试、打包、部署等等。Site Lifecycle:生成项目报告、站点,发布站点。
3.7 maven的概念模型
Maven包含了一个项目对象模型(POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

项目对象模型:一个
maven工程都有一个pom.xml文件,通过该文件定义项目的坐标、项目依赖、项目信息、插件目标等。依赖管理系统:通过maven的依赖管理对项目所依赖的jar包进行统一管理。
- 如:项目依赖
junit4.9,通过在pom.xml中定义junit4.9的依赖即使用junit4.9,如下所示junit4.9的依赖定义: 
<dependencies> <!-- 此项目运行使用junit,所以此项目依赖junit --> <dependency> <!-- junit的项目名称 --> <groupId>junit</groupId> <!-- junit的模块名称 --> <artifactId>junit</artifactId> <!-- junit版本 --> <version>4.9</version> <!-- 依赖范围:单元测试时使用junit --> <scope>test</scope> </dependency> </dependencies>- 如:项目依赖
 一个项目生命周期:使用maven完成项目的构建,项目构建包括:清理、编译、测试、部署等过程。maven将这些过程规范为一个生命周期,如下所示:

- 一组标准集合:maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,标准的生命周期阶段、依赖管理和标准的坐标定义等。
 - 插件(
plugin)目标(goal):maven管理项目生命周期过程都是基于插件完成的。 
4. IDEA开发maven项目
4.1 IDEA的maven配置
打开-->File-->Settings,搜索maven,配置如下内容:

4.2 在IDEA中创建一个maven的web工程
新建工程,选择IDEA提供好的maven的web工程模板

点击Next填写项目信息

点击Next,配置相关属性,此处不做改动。

再点击Next选择项目所在目录,最后点击Finish,等待项目构建。显示如下信息则构建成功。

最终目录结构并不完整,需手动补齐。手动添加src/main/java目录,将java目录设置为Sources Root。
4.2.1 创建一个Servlet
package com.zero.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/hello.jsp").forward(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
4.2.2  配置pom.xml
此时编译器会提示servlet相关包不存在,需要在pom.xml中添加坐标。添加jar包坐标时,还可指定该jar包的作用范围。
<dependencies>
<!--    放置项目运行所依赖的jar包-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
依赖范围表:
| 依赖范围 | 编译时有效 | 测试时有效 | 运行时有效 | 例 | 
|---|---|---|---|---|
compile | 
Y | Y | Y | spring-core | 
test | 
- | Y | - | Junit | 
provided | 
Y | Y | - | servlet-api | 
runtime | 
- | Y | Y | JDBC驱动 | 
system | 
Y | Y | - | 本地的,Maven仓库之外的类库 | 
scope范围依赖小结:
- 默认引入的jar包使用
compile[默认范围,可不写,编译、测试、运行都有效] servlet-api、jsp-api使用provided[编译、测试有效,运行时无效,防止和tomcat下jar包冲突]- JDBC驱动包使用
runtime[测试、运行有效] Junit使用test[仅测试有效]
依赖范围由强到弱的顺序是:compile>provided>runtime>test
4.2.3 运行
点击M图标,输入tomcat7:run运行maven项目。

4.2.4 配置断点调试
在项目配置中添加maven项目,设置操作命令。

点击小虫子,即可启动debug模式。

5. 总结
5.1 maven仓库
maven仓库的类型有哪些?maven工程查找仓库的流程是什么?- 本地仓库如何配置?
 
5.2 常用的maven命令
compile:编译clean:清理test:测试package:打包install:安装
5.3 坐标定义
在pom.xml中定义坐标,内容包括:groupId、artifactld、version,示例如下:
<!--项目名称,定义为组织名+项目名,类似包名-->
<groupId>com.zero.maven</groupId>
<!--模块名称-->
<artifactId>maven-first</artifactId>
<!--当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本-->
<version>1.0-SNAPSHOT</version>
<!--打包类型-->
<packaging>war</packaging>
    <!--
        jar:执行package会打包成jar包
         war:执行package会打包成war包
        pom:用于maven工程的继承,通常父工程设置为pom
    -->
5.4 pom基本配置
pom.xml是Maven项目的核心配置文件,位于每个工程的根目录,基本配置如下:
<project>文件的根节点</project>
<modelversion>pom.xml使用的对象模型版本</modelversion>
<groupId>项目名称,一般写项目的域名</groupId>
<artifactld>模块名称或子项目名</artifactld>
<version>产品的版本号</version>
<packaging>打包类型,有jar、war、pom等</packaging>
<name>项目的显示名,常用于Maven生成的文档</name>
<description>项目描述,常用于Maven生成的文档</description>
<dependencies>项目依赖构件配置,配置项目依赖构件的坐标</dependencies>
<build>项目构建配置,配置编译、运行插件等</build>