03-Maven详解

1. 简介

  • Maven 是一个项目管理工具,可以对 Java 项目进行自动化的构建和依赖管理。在JavaWeb开发中,可以极大地方便导入jar包
  • Maven的高级之处在于:帮助导入所需jar包所依赖的所有jar包
  • Maven的核心思想是:约定大于配置。即:Maven会规定好该如何去编写Java代码(eg:项目的目录结构等),必须要按照这个规范来,不要去违反

2. 下载安装

Image
  • apache-maven-3.8.6-bin.zip 解压的安装目录下即可直接使用

3. 目录分析

Image

4. 环境变量

  • 在《高级系统设置》中配置《环境变量》的《系统变量中》进行配置:
Image
Image
Image
  • 环境变量配置后,在cmd窗口输入如下指令:mvn -version,,检验是否配置成功。若配置成功则返回Maven的版本信息
Image

5. 配置文件

  • 在maven安装目录下conf目录下修改settings.xml配置文件。

1. 阿里云镜像

  • 为了加速下载jar包,国内建议使用阿里云的镜像。在<mirrors>……</mirrors>中添加:
<!-- 阿里云镜像 -->
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>
  • 注:①一定不要配置已经失效的镜像,否则会导致导包有问题,②可以在此配置多个镜像。

2. 本地仓库

  • 在Maven安装目录下,新建一个maven-repository文件夹用来存放项目依赖的jar
<!-- 本地仓库 -->
<localRepository>D:\Environment\apache-maven-3.8.6\maven-repository</localRepository>
  • 注:settings.xml配置文件中默认的本地仓库地址:${user.home}/.m2/repository,如下图所示:
Image

6. IDEA创建Maven项目

1. Maven创建Web项目

  1. 启动IDEA,使用Maven的webapp模板创建一个MavenWeb项目
Image
Image
  1. 填写项目基本信息(传说中的Maven GAV)
Image
  1. 配置Maven的安装目录、配置文件、本地仓库目录信息后,点击Finish按钮,完成MavenWeb项目创建。此时,Maven会自动从阿里云上导入大量jar包到本地仓库
Image
  • 注: Bundled(Maven 3) 是IDEA默认自带的Maven,它的可配置信息非常少。选择的是自己下载安装的Maven
Image
  1. 等待项目初始化完毕,直至消息窗口出现BUILD SUCCESS,表明项目创建成功
Image
  1. 查看Maven本地仓库,会发现里面已经下载了许多jar
  2. 点击File下的Settings菜单,检查项目中maven的相关配置是否正常
Image
  • 注: IDEA在项目自动创建完成后,Maven home directory经常会指向IDEA默认的Maven目录
  1. Maven的高级配置:建议选中《自动导入源码》选项。
Image
  1. MavenWeb项目目录
Image
  • 注: 一般不直接使用Maven的项目模板创建Web项目,而是将普通的Maven项目手动转化成Web项目

2. 普通Maven项目

  1. 在上述MavenWeb项目打开的基础上,点击FileNew Projects SetingsSettings for New Projects菜单修改idea的全局默认配置
Image
  1. 对Maven的安装目录、配置文件、本地仓库进行全局设置
Image
  1. 点击FileNewProject菜单,使用Maven创建一个普通的maven项目。不选择使用模板,直接点击next按钮
Image
  1. 填写项目基本信息(GAV)
Image
  1. 点击Finish按钮,并选择在新窗口中打开,便完成普通Maven项目创建
Image
  1. 使用IDEA创建的普通Maven项目目录
Image

3. IDEA全局配置、项目配置

  • IDEA中的FileNew Projects SetingsSettings for New Projects菜单
  • IDEA欢迎界面下方的ConfigureSetings菜单均为全局配置,对所有的新项目均有效
  • IDEA中的FileSetings菜单是项目配置,仅对当前打开的项目有效
Image

7. IDEA标记文件夹

  • IDEA中不同颜色的文件夹用于存放不同类型的文件。对于新建的文件夹,两种方法进行标记
  1. 通过右键mark directory as菜单直接对文件夹进行逐一标记
Image
  1. 通过右键FileProject Structure(项目结构配置)菜单对所有文件夹进行统一标记
Image
  • 注:target目录是IDEA默认的编译路径,用来存放项目的:文件和目录、jar包、war包、class文件等

8. Maven侧边栏的使用

Maven的常用命令行操作(双击即可执行):

cmd介绍
clean(清理)对项目进行清理,删除target目录下编译的内容
compile(编译)编译项目源代码
test(测试)对项目进行运行测试
package(打包)打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的.class文件
install(安装)在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target目录下
deploy(部署)在整合、发布环境下执行,将最终版本的包上传到远程的repository,使得其他的开发者或工程可以共享
c8cb5a92922a4c518e48ce49b9871be2

9. pom.xml

  • pom.xml是Maven的核心配置文件
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- 当前POM模型的版本 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 这就是我们创建项目时配置的GAV -->
    <groupId>com.atangbiji</groupId><!-- 项目组织的唯一标识符 -->
    <artifactId>javaWeb-01-maven</artifactId><!-- 项目的唯一标识符 -->
    <version>1.0-SNAPSHOT</version><!-- 版本号 -->
    <!-- 项目的打包方式:1. jar包:Java应用 2.war包:JavaWeb应用 -->
    <packaging>war</packaging>

    <!-- 项目的名称, Maven产生的文档用(了解) -->
    <name>javaWeb-01-maven Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <!-- 项目主页的URL, Maven产生的文档用(了解) -->
    <url>http://www.example.com</url>

    <!-- 属性 -->
    <properties>
        <!-- 项目的默认构建编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 编译器版本 -->
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <!-- 项目依赖(重点) -->
    <!-- Maven的高级之处在于:它会帮助我们导入我们所需jar包所依赖的所有jar包 -->
    <dependencies>
        <!-- 具体依赖的jar包配置文件 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!-- 注:mybatis、redis、spring、SpringMVC等内容所依赖的jar包均在此配置 -->
    </dependencies>

    <!-- 项目构建用到的插件 -->
    <build>
        <!-- 在此对target目录下mvn clean package打的jar包进行重命名 -->
        <finalName>javaWeb-01-maven</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
  • 注1:dependencies(项目依赖)是关注的重点,与Maven窗口中的dependencies目录和项目窗口中的External Libraries是对应的
12c1f5c8464e4a3dbd2a00f9914835fd
  • 注2:Maven的约定大于配置思想,可能会遇到配置文件(eg:*.xml写在了项目中的Java目录下)无法被导出或无法生效的问题。解决方法:在pom.xml<build>……</build>中配置resources,修改Maven约定的过滤条件,来防止资源导出失败
<!-- 在build中配置resources,防止资源导出失败的问题 -->
<build>
    <resources>
        <!-- 选择需要导出资源的路径,可以选择多个 -->
        <resource>
            <directory>src/main/resources</directory>
            <!-- 写入需要导出的什么类型的文件 -->
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <!-- 不去过滤这些文件 -->
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <!-- 不去过滤这些文件 -->
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

10. 导包dependencies机制

1. 依赖机制介绍

  • Maven仓库是通过dependency(依赖)机制进行jar包导入的
  • dependency机制是通过在配置文件pom.xml中的手动添加标签来实现的。 具体代码由Maven在线仓库处获得
  1. Maven的在线仓库open in new window 中搜索目标jar
Image
  1. 选择合适的版本(一般选使用者较多的版本)
Image
  1. 复制Maven的dependency依赖代码
Image
  1. 将代码粘贴到pom.xml文件的<dependencies> ... </dependencies>标签中
Image
  1. 重新加载Maven项目。Maven便会自动下载相关依赖包。pom.xml文件中的dependenciesMaven窗口中的dependencies目录和项目窗口中的External Libraries是对应的
5685d6d4b2314e4da960f0ca28607a44

2. 项目jar包结构树

  • 点击Maven依赖结构树生成按钮,会生成该项目中各依赖包之间的关系树
8cc474877f724084808247fb8901e11a

99. bug

1. Maven、JDK版本匹配问题

1. 现象描述

  • MavenWeb项目和Maven普通项目创建成功,当使用Maven编译/运行该项目时会发现:Maven虽然会把依赖包导入到本地仓库中,也不报错,但在左侧项目栏的External Libraries目录下始终只有JDK的包,右侧Maven窗口中也无法生成该项目的PluginsDependencies组件包
Image

2. 问题分析

  • Maven窗口中右键打开Maven的配置文件,此时会发现配置文件中有两个错误
c6407eeafcbb45ad9ab0b404ec8b6171
  • 点击HelpShow Log in Explorer菜单打开IDEA日志文件idea.log(最新的日志在最下面)
36a7d31ea3fe4d4c9dc809e4da1d1d51
  • 查看IDEA日志文件发现有函数找不到
6b14fdd791224606beb003c208f74b35
  • 经分析,是Maven版本过高,和JDK版本不匹配造成的

3. 解决方法

将Maven版本更换为maven-3.6.1,让Maven版本与JDK1.8版本相匹配(IDEA2020.2

  • 重新下载安装apache-maven-3.6.1
  • 重新配置Maven环境变量
  • 重新配置阿里云镜像和本地仓库
  • 重新对Maven的安装目录、配置文件和本地仓库进行全局设置
  • 通过FileInvalidate Caches/Restart菜单,清除缓存并重启项目
Image
  • 此时便可以正常使用Maven编译/运行项目了。左侧项目栏的External Libraries目录下除了JDK的包外会生成Maven导入的依赖包,右侧Maven窗口中也会生成该项目的PluginsDependencies组件包
3a88125766774957990b77dc768634e7