Maven

Maven是什么

Maven是一个免费、开源的,用Java编写的项目构建和依赖管理工具

Maven的特点

  • 默认的目录结构
  • 第三方依赖管理
    通过配置pom.xml文件,从远程仓库下载相关Jar包。解决了依赖维护问题
  • 提供了一致的项目构建管理方式
    生命周期。减少了构建工作量
  • 插件式架构,大量的可重用插件
  • 方便地集成于IDE

MAVEN的安装及配置

  1. 官网下载压缩包,解压到合适文件目录下。

  2. 配置环境变量 - 系统变量

    • M2_HOME = 文件目录
    • 添加%M2_HOME%/bin到Path
  3. 配置maven的阿里云镜像

    配置方式见阿里云仓库服务,修改maven配置文件conf\settings.xml即可

    1
    2
    3
    4
    5
    6
    <mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
  4. 建立本地仓库

    本地仓库也是在conf\settings.xml中配置,默认地址为${user.home}/.m2/repository

    1
    2
    3
    4
    5
    6
    <!-- 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

是一种后续省心的创建方式。

image-20220111011500763

创建后,目前默认产生的src/main/webapp/WEB-INF/web.xml文件的内容比较老旧,如下:

1
2
3
4
5
6
7
<!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>

需要更新为如下较新的版本:

1
2
3
4
5
6
<?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目录下创建两个目录:javaresources。2021.3.2版本的IDEA在main目录上右键 - New - Directory,就会默认出现这两个目录名,选中创建即可。


方式二:不勾选Create from archetype

原生态一点,直接打包好的项目可能会缺少部分文件,需要手动添加才能保证项目的顺利运行。

  1. 创建完成后,右键项目文件夹 - Add Framwork Support…

    Add Framwork Support...

  2. 勾选Web Application - Versions:4.0 - Create web.xml - OK

    Web Application

  3. 会在项目文件夹下,生成一个web文件夹

    可以在web/WEB-INF/web.xml中看到[方式一](#方式一:Create from archetype)更新的内容。

  4. pom.xml中添加了需要的依赖之后,需要手动添加依赖的jar包到WEB-INF/lib文件夹下

    • File - Project Structure - Project Settings - Artifacts - 选择目标web应用 - Output Layout - Avaliable Elements

      可以看到项目,项目下是由依赖关系添加的Jar包

      Avaliable Elements

    • 双击这些Jar包,它们就会自动添加到左边的WBE-INF/lib目录下(首次添加时会自动创建lib目录),OK关闭窗口即可

      添加Jar包到

只有这样,最后打包的项目中才有依赖的Jar包,项目才能正常运行。

参考:Idea使用maven创建项目常见错误和注意点


选择自定义的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种方式

    1. 修改${user.home}/.m2/settings.xml(默认文件,是最省心的方式)
    2. IDEA中修改maven配置文件的路径,更改为maven目录下的conf\settings.xml
    3. 在便于管理的目录下,自定义一个maven配置的xml文件(私以为${user.home}/.m2/目录下就很好)

pom.xml

pom(project object model, 项目对象模型),是Maven的核心配置文件。

  • groupIdartifactIdversion构成项目的唯一标识(坐标),不能重复。

使用Maven管理依赖,出现依赖冲突是很常见的情况。当存在依赖冲突时,Maven选择依赖的原则:

  1. 最短路径原则

    image-20240717095622211

    该图中,会选择路径最短的v1.0的M。

  2. 声明优先原则

    如果两组依赖路径长度一致,在pom文件中排前面的会被使用。

在IDEA中,处理依赖冲突时,使用Maven Helper插件能快速地解决冲突。安装该插件后,pom.xml文件下方会出现一个Dependency Analyzer页签,可以很直观地查看冲突。

image-20240717095932051

image-20240717100202505

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

image-20240717100401865

参考:【IDEA】遇到依赖冲突怎么办 这款插件轻松解决_哔哩哔哩_bilibili


Maven的生命周期

maven有三套独立的生命周期

  1. clean(删除构建的Jar包、class文件等)
    pre-clean → clean → post-clean
  2. site(生成站点文档)
    pre-site → site → post-site → site-deploy
  3. default
    1. validate (验证项目是否正确,所需信息是否有缺失)
    2. process-resources(将资源文件复制到项目目录下,之后打包用)
    3. compile (编译源代码)
    4. test (单元测试)
    5. package (打包)
    6. install (把打包的项目拷到本地仓库下)
    7. deploy (把打包的项目上传到远程仓库)

Maven的问题

由于Maven的约定大于配置,可能会遇到配置文件无法导出或无法生效的问题

解决方案:<build>中配置<resource>节点,防止资源导出失败的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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>