Maven
Maven是什么
Maven是一个免费、开源的,用Java编写的项目构建和依赖管理工具。
Maven的特点
- 默认的目录结构
 - 第三方依赖管理
通过配置pom.xml文件,从远程仓库下载相关Jar包。解决了依赖维护问题。 - 提供了一致的项目构建管理方式
生命周期。减少了构建工作量。 - 插件式架构,大量的可重用插件
 - 方便地集成于IDE
 
MAVEN的安装及配置
官网下载压缩包,解压到合适文件目录下。
配置环境变量 - 系统变量
M2_HOME = 文件目录- 添加
%M2_HOME%/bin到Path 
配置maven的阿里云镜像
配置方式见阿里云仓库服务,修改maven配置文件
conf\settings.xml即可<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>建立本地仓库
本地仓库也是在
conf\settings.xml中配置,默认地址为${user.home}/.m2/repository<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> -->
基本操作命令
| 命令 | 作用 | 
|---|---|
mvn archetype:generate | 
使用模板生成项目 | 
mvn compile | 
编译源代码 | 
mvn test | 
单元测试 | 
mvn package | 
打包项目,Java项目→Jar;Web项目→War | 
mvn deploy | 
部署,把打包后的项目上传发布到远程仓库 | 
mvn site | 
生成项目相关的站点、在线文档 | 
mvn clean | 
清理,删除构建的Jar包、class文件等 | 
mvn install | 
把打包的目录拷到本地仓库 | 
在IDEA中使用Maven
创建一个Maven项目
方式一:Create from archetype
是一种后续省心的创建方式。

创建后,目前默认产生的src/main/webapp/WEB-INF/web.xml文件的内容比较老旧,如下:
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>
需要更新为如下较新的版本:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>
另外,需要在src/main目录下创建两个目录:java和resources。2021.3.2版本的IDEA在main目录上右键 - New - Directory,就会默认出现这两个目录名,选中创建即可。
方式二:不勾选Create from archetype
原生态一点,直接打包好的项目可能会缺少部分文件,需要手动添加才能保证项目的顺利运行。
创建完成后,右键项目文件夹 - Add Framwork Support…

勾选
Web Application- Versions:4.0-Create web.xml- OK
会在项目文件夹下,生成一个web文件夹
可以在
web/WEB-INF/web.xml中看到[方式一](#方式一:Create from archetype)更新的内容。在
pom.xml中添加了需要的依赖之后,需要手动添加依赖的jar包到WEB-INF/lib文件夹下File - Project Structure - Project Settings - Artifacts - 选择目标web应用 - Output Layout - Avaliable Elements
可以看到项目,项目下是由依赖关系添加的Jar包:

双击这些Jar包,它们就会自动添加到左边的
WBE-INF/lib目录下(首次添加时会自动创建lib目录),OK关闭窗口即可
只有这样,最后打包的项目中才有依赖的Jar包,项目才能正常运行。
选择自定义的maven配置文件
File - Settings - 搜索maven:
Maven home path:选择使用的maven的路径Bundled(Maven 3)是IDEA捆绑的Maven- 也可选择自己下载的Maven
 
User settings file:用户配置文件IDEA默认的maven配置文件为
${user.home}/.m2/settings.xml。上文MAVEN的安装及配置中提到的为了快速下载依赖而配置的maven的阿里云镜像想要继续生效,有3种方式:- 修改
${user.home}/.m2/settings.xml(默认文件,是最省心的方式) - IDEA中修改maven配置文件的路径,更改为maven目录下的
conf\settings.xml - 在便于管理的目录下,自定义一个maven配置的
xml文件(私以为${user.home}/.m2/目录下就很好) 
- 修改
 
pom.xml
pom(project object model, 项目对象模型),是Maven的核心配置文件。
groupId、artifactId和version构成项目的唯一标识(坐标),不能重复。
使用Maven管理依赖,出现依赖冲突是很常见的情况。当存在依赖冲突时,Maven选择依赖的原则:
最短路径原则
该图中,会选择路径最短的v1.0的M。
声明优先原则
如果两组依赖路径长度一致,在pom文件中排前面的会被使用。
在IDEA中,处理依赖冲突时,使用Maven Helper插件能快速地解决冲突。安装该插件后,pom.xml文件下方会出现一个Dependency Analyzer页签,可以很直观地查看冲突。

发生冲突的依赖会展示在右侧,如果想定位到具体发生冲突的依赖,只要在对应的依赖上,右键选择Jump to Left Tree,就能在左边展示的树状依赖中定位,确定需要排除的依赖。确定好需要移除的依赖,右键选择Exclude就能排除不需要的依赖。

Maven的生命周期
maven有三套独立的生命周期
- clean(删除构建的Jar包、class文件等)
pre-clean → clean → post-clean - site(生成站点文档)
pre-site → site → post-site → site-deploy - default
- validate (验证项目是否正确,所需信息是否有缺失)
 - process-resources(将资源文件复制到项目目录下,之后打包用)
 - compile (编译源代码)
 - test (单元测试)
 - package (打包)
 - install (把打包的项目拷到本地仓库下)
 - deploy (把打包的项目上传到远程仓库)
 
 
Maven的问题
由于Maven的约定大于配置,可能会遇到配置文件无法导出或无法生效的问题。
解决方案:在<build>中配置<resource>节点,防止资源导出失败的问题。
<build>
	<resources>
    	<resource>
            <directory>src/main/resources</directory>
            <excludes>
            	<exclude>**/*.properties</exclude>
                <exclude>**/*.xml</exclude>
            </excludes>
            <filtering>false</filtering>
        </resource>
        <resource>
        	<directory>src/main/java</directory>
            <includes>
            	<include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>