目录
一、Maven基础:
1、概述:
Maven是Apache旗下的一个开源项目,就是一个软件工具,用于管理和构建Java项目
Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。
2、作用:
1. 依赖管理
方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题手动管理上面项目jar包时,可能会遇到下面问题:
- 需要到不同的官网下载不同的jar
- 需要自己测试多个jar之间是否版本兼容 (maven: 不兼容可手动调整)
- 需要自己分析依赖关系,例如a.jar依赖b.jar,那么我们使用a.jar的时候也要把b.jar下载下来
- 需要自己管理jar和其对应的源码和javadoc
- .....
使用Maven后,这些问题都统统帮我们解决了,它会对项目中依赖的jar进行管理,我们只需要在maven项目的pom.xml文件中,添加一段如下图所示的配置即可实现。
2. 统一项目结构
提供标准、统一的项目结构。
在项目开发中,当你使用不同的开发工具 ( 如: Eclipse 、 Idea) ,创建项目工程的结构并不统一:
若我们创建的是一个maven工程,则项目结构为统一标准,具体如下:
目录说明:
- src/main/java: java源代码目录
- src/main/resources: 配置文件信息
- src/test/java: 测试代码
- src/test/resources: 测试配置文件信息
3. 项目构建
maven提供了标准的、跨平台(Linux、Windows、MacOS) 的自动化项目构建方式。
项目构建,是指一个项目清理、编译、测试、报告、打包、安装、部署等过程,Maven中把这些过程进行了标准化管理,可以通过一个命令,自动按照顺序,依次执行这里面的每一个步骤。
其中:
清理clean:将之前编译得到的旧文件class字节码文件删除
编译compile:将java源程序编译成class字节码文件
测试test:自动测试,自动调用junit程序
报告report:测试程序执行的结果
打包package:动态Web工程打War包,java工程打jar包
安装install:Maven特定的概念,将打包得到的文件复制到maven仓库中的指定位置
部署deploy:将工程生成的结果放到服务器中或者容器中,使其可以运行
注意,Maven允许在每个步骤中,除了默认的操作外,还可以通过插件来定义用户指定的操作
3、安装:
(1)Maven官网:maven.apache.org 找到对应的版本下载
(2)在无中文的、空格、特殊符号的路径下解压,得到目录如下

- bin目录 : 存放的是可执行命令。(mvn 命令重点关注)
- conf目录 :存放Maven的配置文件。(settings.xml配置文件后期需要修改)
- lib目录 :存放Maven依赖的jar包。(Maven也是使用java开发的,所以它也依赖其他的jar包)
(3)配置配置Maven环境变量:MAVEN_HOME=D:\briup\apache-maven-3.6.3

(4)配置Path变量:Path=%MAVEN_HOME%\bin;

(5)测试安装是否成功 :重新打开一个新终端窗口,输入命令: mvn -v

4、仓库:
(1)本质:
仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖(就是jar包)和插件
(2)分类:
本地仓库:自己计算机上的一个目录(用来存储jar包)
配置方法:
在maven目录下创建一个文件夹,并赋复制该文件夹的路径。
进入到conf 目录下修改 settings.xml 配置文件
1). 使用超级记事本软件,打开settings.xml 文件,定位到 53 行左右
2). 复制标签,粘贴到注释的外面
3). 复制之前新建的用来存储jar 包的路径,替换掉标签体内容
中央仓库:由Maven团队维护的全球唯一的 https://repo1.maven.org/maven2/当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包 如果有,则在项目直接引用 ;如果没有,则去中央仓库中下载对应的jar包到本地仓库
远程仓库(私服):一般由公司团队搭建的私有仓库由于中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包
配置方法:
进入到conf目录下修改settings.xml配置文件:
1). 使用超级记事本软件,打开settings.xml文件,定位到160行左右2). 在标签下为其添加子标签,内容如下:
XML<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
注 : 只可配置一个 ( 另一个要注释 !) ,不然两个可能发生冲突,导致 jar 包无法下载!!!
仓库使用顺序:本地仓库 --> 远程仓库--> 中央仓库
二、Maven项目的创建:
1、创建步骤:
1、选择 IDEA中 File => Settings => Build,Execution,Deployment => Build Tools => Maven

2、设置IDEA使用本地安装的Maven,并修改配置文件及本地仓库路径

这是一个英文版:
- maven主路径:maven的安装目录
- 用户设置文件:当前maven的settings.xml配置文件的路径
- 本地仓库:刚刚创建的本地仓库的文件夹的路径
3、配置工程的编译版本为8
Maven默认使用的编译版本为5,版本过低,需要修改为8.

上述配置的maven环境,只是针对于当前工程的,如果我们再创建一个project,又恢复成默认的配置了。 要解决这个问题, 我们就需要配置全局的maven环境。
全局设置
1、进入到IDEA欢迎页面 :选择 IDEA中 File => close project 回到初始页面
2、打开 All settings,选择 Build,Execution,Deployment => Build Tools => Maven,然后配置MAVEN环境,前面已做过。
3、配置工程的编译版本为8,前面已做过。
这里所设置的maven的环境信息,并未指定任何一个project,此时设置的信息就属于全局配置信息。 以后,我们再创建project,默认就是使用我们全局配置的信息。
案例展示:maven项目的创建案例
1、创建一个空项目
2、创建模块,选择Maven,点击Next
3、填写模块名称,坐标信息,点击finish,创建完成
4、在Maven工程下,创建HelloWorld类
5、运行程序
补充:maven项目的目录:
maven-demo01
|--- src (源代码目录和测试代码目录)
|--- main (源代码目录)
|--- java (源代码java文件目录)
|--- resources (源代码配置文件目录)
|--- test (测试代码目录)
|--- java (测试代码java目录)
|--- resources (测试代码配置文件目录)
|--- target (编译、打包生成文件存放目录)
2、POM文件:
(1)概述:
POM (Project Object Model) :指的是项目对象模型,用来描述当前的 maven 项目,其借助pom.xml 文件来实现。
(2)结构:
<project> --根标签表示当前项目
<modelVersion>......--指明遵循哪一个pom模型版本
<groupId>......--坐标
<artifactId>......
<version>......
<packaging>......</packaging>--打包方式
</project>
案例展示:pom文件展示:
XML
<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">
<modelVersion>4.0.0</modelVersion>
<!-- 1.公司或者组织域名倒序+项目名 -->
<groupId>com.briup.demo</groupId>
<!-- 2.模块名 -->
<artifactId>mvn-test</artifactId>
<!-- 3.版本 -->
<version>0.0.1-SNAPSHOT</version>
<name>mvn-test</name>
<!-- 配置当前项目中,所依赖的其他maven项目(jar包) -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
(3)坐标:
在Maven中,每一个项目都有三个坐标(GAV),用来唯一标识这个项目
- groupId ,该元素定义当前Maven项目隶属的实际项目
- artifactId ,该元素定义当前maven项目表示的具体子项目(模块)
- version ,该元素定义当前maven项目的具体版本
依赖也是由这三个标签定义的
(4)依赖的配置:
本质:引入需要的jar包;
语法:
XML
<dependencies>
<dependency>
<groupId>jarbao目录中所在的文件名</groupId>
<artifactId>所在文件名中文件的名字</artifactId>
<version>所要依赖的版本号</version>
<scope>该依赖可以使用的范围</scope>
</dependency>
</dependencies>
案例展示:
XML
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
对应jarbao中的目录:

版本号的选择:

<scope>标签:
项目中添加的依赖,都是有范围的 <scope> ,默认值是compile
compile ,默认值,适用于所有阶段(开发、测试、部署、运行),jar包会一直存在所有阶段
provided ,只在开发、测试阶段使用,目的是不让将来部署的容器和你本地仓库的jar包冲突 因为有些jar包在将来部署的服务器或者容器中是存在的,所以打包的是就不需要把这些jar添加进来了如servlet相关jar包,项目中添加的依赖,都是有范围的 <scope> ,默认值是compile
runtime ,只在运行时使用,如JDBC驱动,适用运行和测试阶段。编译时用不到
test ,只在测试时使用,用于编译和运行测试代码。不会随项目发布,如JUnit相关jar包
例如:
XML<dependencies> <dependency> <groupId>sun.jdk</groupId> <artifactId>tools</artifactId> <version>1.5.0</version> <scope>system</scope> <systemPath>D:/vanse/hello.jar</systemPath> <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <!--只有在测试的时候jar包才生效 --> <scope>test</scope> </dependency> </dependencies>
注意,大多数依赖 jar 的 scope 都是 compile ,也就是默认值,在项目中导入依赖的jar 包后,可以在任何地方使用。
依赖排除:依赖之间存在直接依赖与间接依赖(依赖于依赖的传递)
但依赖的传递可能会引发依赖冲突,如1依赖于2和3的1版本,而2依赖于3的2版本,那这样3的两个版本就会发生冲突。
解决方法:利用<exclusions>
案例展示:
XML<!--引入mvn-demo02模块--> <dependency> <groupId>com.briup</groupId> <artifactId>mvn-demo02</artifactId> <version>1.0-SNAPSHOT</version> <!-- 依赖排除 --> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency>
(5)变量:
在pom.xml文件中的 <properties> 标签里面,可以定义变量,然后再下面的配置中,去使用这个变量:
XML
<properties>
<!-- 这三个变量,其实使用让maven默认自带的插件使用的 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 指定hello项目的版本(变量) -->
<test.version>1.0-SNAPSHOT</test.version>
</properties>
<dependencies>
<dependency>
<groupId>com.briup</groupId>
<artifactId>test</artifactId>
<version>${test.version}</version>
</dependency>
</dependencies>
三、Maven生命周期:
生命周期的顺序是:clean --> validate --> compile --> test --> package --> verify --> install --> site --> deploy
Maven的生命周期就是为了对所有的构建过程进行抽象和统一。 描述了一次项目构建,经历哪些阶段。
在Maven出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理,编译,测试及部署。虽然大家都在不停地做构建工作,但公司和公司间、项目和项目间,往往使用不同的方式做类似的工作。
Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完美的,容扩展的项目构建生命周期。这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。
Maven对项目构建的生命周期划分为3套(相互独立):

clean:清理工作。
default:核心工作。如:编译、测试、打包、安装、部署等。
site:生成报告、发布站点等。
三套生命周期又包含哪些具体的阶段呢, 我们来看下面这幅图:

我们看到这三套生命周期,里面有很多很多的阶段,这么多生命周期阶段,其实我们常用的并不多,主要关注以下几个:
-
clean:移除上一次构建生成的文件
-
compile:编译项目源代码
-
test:使用合适的单元测试框架运行测试(junit)
-
package:将编译后的文件打包,如:jar、war等
-
install:安装项目到本地仓库
在日常开发中,当我们要执行指定的生命周期时,有两种执行方式:
-
在idea工具右侧的maven工具栏中,选择对应的生命周期,双击执行
-
在DOS命令行中,通过maven命令执行
eg:mvn install