1、Maven 简介

Maven 是一个项目管理工具,可以对 Java 项目进行自动化的构建和依赖管理。在JavaWeb开发中,使用Maven 可以极大地方便我们导入jar包。Maven的高级之处在于:它会帮助我们导入我们所需jar包所依赖的所有jar包。

**Maven的核心思想是:约定大于配置。**即:Maven会规定好我们该如何去编写我们的Java代码(如:项目的目录结构等),我们必须要按照这个规范来,不要去违反。

2、下载安装Maven

在官网:https://maven.apache.org 下载Maven安装包apache-maven-3.8.6-bin.zip

Maven下载

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

3、Maven目录分析

Maven安装目录

4、配置Maven环境变量

  • 在“高级系统设置”中配置“环境变量”的“系统变量中”进行如下配置:
环境变量 地址
新建系统变量:M2_HOME maven安装目录下bin目录
新建系统变量:MAVEN_HOME maven安装目录
修改环境变量: path %MAVEN_HOME%\bin

如下图所示:

新增系统变量 修改环境变量Path
  • 环境变量配置后,在cmd窗口输入如下指令:mvn -version,,检验是否配置成功。若配置成功则返回Maven的版本信息。如下图所示:

    Maven配置成功

5、配置Maven配置文件

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

5.1、配置阿里云镜像

为了加速我们下载jar包,国内建议使用阿里云的镜像。在<mirrors>……</mirrors>中添加:

1
2
3
4
5
6
7
<!-- 阿里云镜像 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>

注:①一定不要配置已经失效的镜像,否则会导致导包有问题,②我们可以在此配置多个镜像。

5.2、配置Maven的本地仓库

在Maven安装目录下,新建一个maven-repository文件夹用来存放我们项目的依赖jar包,并在配置文件中将其设置为我们的本地仓库:

1
2
<!-- 本地仓库 -->
<localRepository>D:\Environment\apache-maven-3.8.6\maven-repository</localRepository>

注:settings.xml配置文件中默认的本地仓库地址:${user.home}/.m2/repository,如下图所示:

默认本地仓库

配置成功后,以后我们使用Maven导入的jar包就都在此了。

6、使用IDEA中创建Maven项目

6.1、使用Maven项目模板创建Web项目(了解)

(1)启动IDEA,使用Maven的webapp模板创建一个MavenWeb项目。

创建一个新项目

创建MavenWeb项目模板

(2)填写项目基本信息(传说中的Maven GAV)。

项目信息

(3)配置Maven的安装目录、配置文件和本地仓库目录信息后,点击Finish按钮,完成MavenWeb项目创建。此时,Maven会自动从阿里云上导入大量jar包到本地仓库。

配置Maven信息

注: Bundled(Maven 3)是IDEA默认自带的Maven,它的可配置信息非常少。我们这里选择的是自己下载安装的Maven,如下图所示。Maven选择

(4)等待项目初始化完毕,直至消息窗口出现BUILD SUCCESS,表明项目创建成功。如下图所示:

创建成功

(5)此时,查看Maven本地仓库,会发现里面已经下载了许多jar包。

(6)点击File下的Settings菜单,检查项目中maven的相关配置是否正常。

检查maven

**注:**IDEA在项目自动创建完成后,Maven home directory经常会指向IDEA默认的Maven目录。如果出现该问题,我们需要手动将其修改为我们自己的Maven安装目录。

(7)Maven的高级配置:建议选中“自动导入源”码选项。

自动导入源码

(8)使用Maven项目模板自动创建的MavenWeb项目目录如下图所示。

MavenWeb项目目录

**注:**我们一般不直接使用Maven的项目模板创建Web项目,而是将普通的Maven项目手动转化成Web项目。

6.2、创建普通的Maven项目(掌握)

(1)在上述MavenWeb项目打开的基础上,点击FileNew Projects SetingsSettings for New Prijects菜单修改IDEA的全局默认配置

进行全局设置

(2)对Maven的安装目录、配置文件和本地仓库进行全局设置

Maven全局设置

(3)点击FileNewProject菜单,使用Maven创建一个普通的maven项目。此时,不选择使用模板,直接点击next按钮。

创建普通Maven项目

(4)填写项目基本信息(传说中的Maven GAV)。

填写项目信息

(5)点击Finish按钮,并选择在新窗口中打开,这样便完成普通Maven项目的创建。

在新窗口中打开

(6)这样我们的Maven普通项目便创建好了。使用IDEA创建的普通Maven项目目录如下图所示:

Maven普通项目目录

附:IDEA全局配置和项目配置

  • IDEA中的FileNew Projects SetingsSettings for New Prijects菜单或IDEA欢迎界面下方的ConfigureSetings菜单均为全局配置,对所有的新项目均有效。

    欢迎页全局设置
  • IDEA中的FileSetings菜单是项目配置,仅对当前打开的项目有效。

7、Maven版本和JDK版本匹配问题(重点)

(1)现象描述

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

使用Maven编译运行该项目

(2)问题分析

  • Maven窗口中右键打开Maven的配置文件,此时会发现配置文件中有两个错误。

打开Maven配置文件

  • 点击HelpShow Log in Explorer菜单打开IDEA日志文件idea.log。(最新的日志在最下面)

打开日志

  • 查看IDEA日志文件发现有函数找不到。

查看日志

  • 经分析,是Maven版本过高,和jdk版本不匹配造成的。

(3)解决方法

将Maven版本更换为maven-3.6.1,让Maven版本与JDK1.8版本相匹配(IDEA2020.2)。具体步骤如下:

  • 重新下载安装apache-maven-3.6.1
  • 重新配置Maven环境变量。
  • 重新配置阿里云镜像和本地仓库。
  • 重新对Maven的安装目录、配置文件和本地仓库进行全局设置。
  • 通过FileInvalidate Caches/Restart菜单,清除缓存并重启项目。

清除缓存并重启项目

此时,我们便可以正常使用Maven编译/运行项目了。左侧项目栏的External Libraries目录下除了JDK的包外会生成Maven导入的依赖包,右侧Maven窗口中也会生成该项目的PluginsDependencies组件包。

编译运行成功

8、IDEA标记文件夹

IDEA中不同颜色的文件夹用于存放不同类型的文件。对于新建的文件夹,我们采用以下两种方法进行标记。

**例:**在上述新建的MavenWeb项目基础上,新建javaresource文件夹。

方法一:通过右键mark directory as菜单直接对文件夹进行逐一标记。

逐一标记文件夹

方法二:通过右键FileProject Structure(项目结构配置)菜单对所有文件夹进行统一标记。

统一标记文件夹

注:target目录是IDEA默认的编译路径,用来存放项目的:文件和目录、jar包、war包、class文件等。

9、Maven侧边栏的使用

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

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

Maven窗口

10、pom.xml

pom.xml是Maven的核心配置文件。

pom.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?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(项目依赖)使我们关注的重点,以后我们要学习的mybatis、redis、spring、SpringMVC等内容所依赖的jar包均在此配置。它与Maven窗口中的dependencies目录和项目窗口中的External Libraries是对应的。

项目依赖

**注2:**由于Maven的“约定大于配置”思想,我们以后可能会遇到我们自己写的配置文件(如:我们配置文件*.xml写在了项目中的Java目录下)无法被导出或者无法生效的问题。该问题的解决方法是:在pom.xml<build>……</build>中配置resources,修改Maven约定的过滤条件,来防止我们的资源导出失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!--在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>

11、Maven导包dependencies机制

11.1、依赖机制介绍

  • Maven仓库是通过dependency(依赖)机制进行jar包导入的。
  • dependency机制是通过在配置文件pom.xml中的手动添加<dependency> ... </dependency>标签来实现的。 具体代码由Maven在线仓库处获得。具体步骤如下:

(1)在Maven的在线仓库https://mvnrepository.com/ ) 中搜索目标jar包。

搜索jar包

(2)选择合适的版本。(一般选使用者较多的版本)

选择版本

(3)复制Maven的dependency依赖代码。

复制代码

(4)将代码粘贴到pom.xml文件的<dependencies> ... </dependencies>标签中。

粘贴代码

(5)重新加载Maven项目。此时,Maven便会自动帮我们下载相关依赖包。pom.xml文件中的dependenciesMaven窗口中的dependencies目录和项目窗口中的External Libraries是对应的。

加载依赖

11.2、项目jar包结构树

点击Maven依赖结构树生成按钮,会生成该项目中各依赖包之间的关系树,如下所示:

生成依赖树

(本讲完,系列博文持续更新中…… )

阿汤笔迹微信公众平台

关注**“阿汤笔迹”** 微信公众号,获取更多学习笔记。
原文地址:http://www.atangbiji.com/2022/09/17/MavenInDetail
博主最新文章在个人博客 http://www.atangbiji.com/ 发布。