- 一、 Maven概述
- 1.1 Maven的概念
- 1.2 Maven的作用
- 1.3 Maven的概念模型
- 1.4 Maven的仓库
- 1.5 Maven的坐标
- 二、 Maven的安装和优化配置
- 2.1 下载Maven
- 2.2 配置环境变量
- 2.3 Maven优化(setting配置)
- 三、 IDEA创建Maven工程
- 四、 Maven的生命周期和常用命令
- 4.1 Maven的生命周期
- Default生命周期(Default Lifecycle)
- 4.1 常用命令
- clean
- compile
- test
- package
- install
- 五、 Maven插件介绍
Maven是Apache下一个纯Java开发的开源项目,它是一个跨平台的项目管理工具
,即针对Java平台的项目构建和依赖的管理。
项目构建 :
我们首先要区别的是,项目构建并不是项目创建的意思,项目创建只是一个工程的创建过程,而项目构建过程包括:【清理→编译→测试→报告→打包→部署】这几个步骤,这六个步骤就是一个项目的完整构建过程。
依赖管理 :
依赖指的是项目与jar包之间的相互依赖,比如我们在使用Spring框架的时候,需要用到Spring依赖的jar包。而依赖管理指的就是使用Maven来管理项目中使用到的jar包,Maven管理的方式就是“自动下载项目所需要的jar包,统一管理jar包之间的依赖关系”。比如在文件上传的时候,光光有common-fileupload这个jar包是不行的,common-fileupload还依赖于common-io这个包jar包,此时由于Maven的依赖管理机制,都会帮我们自动下载这些包,我们并不需要管。
1.2 Maven的作用为什么使用Maven我们首先得去分析传统项目管理的缺陷有哪些:
- jar包需要我们自己去网上下载,非常的麻烦,而且有些jar包根本找不到。
- 如果某个jar需要依赖其它jar包的话,还需要去找依赖的jar包,而且很有可能我们漏掉了某个依赖关系,就会导致项目运行报错。
- 没有对jar包的版本统一管理,容易导致版本冲突。
- 传统的一个项目就是一个工程。如果项目比较庞大,那么利用包名来划分模块,显然容易造成混淆而且不利于分工合作。
- 传统项目的部署和迁移不方便,容易出现错误。
根据以上缺陷便可以总结出使用Maven的好处:
- 避免四处找jar包, 通过maven引入对应依赖,就自动去仓库下载。
- 消除Jar包之间的相互依赖。
- 避免Jar包冲突
- 项目拆分多个模块。
- 项目的步署和迁移方便,甚至分步式部署也很方便。
-
项目对象模型 (Project Object Model)。POM对象模型,每个maven工程中都有一个pom.xml文件,定义工程所依赖的jar包、本工程的坐标、打包运行方式。
-
依赖管理系统(基础核心 ), maven通过坐标对项目工程所依赖的jar包统一规范管理。
-
maven 管理项目生命周期过程都是基于插件完成的,例如:开发中使用的tomcat插件。
Maven的仓库,就指的就是存放jar包的地方。 在Maven中的仓库分为三个类型,它们分别为:本地仓库、远程仓库和中央仓库。其实远程仓库它包含了中央仓库,私服,和其他公共库。
仓库名称作用本地仓库相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找(我们使用的是阿里巴巴的远程仓库)。中央仓库就是远程仓库,仓库中jar由专业团队(maven团队)统一维护。远程仓库在公司内部架设一台私服,其它公司架设一台仓库,对外公开。 Maven下载jar包的优先级:
- ①、如果本地仓库有,就从本地仓库里拿。
- ②、如果本地仓库没有,就从私服拿,顺便下载一份到本地仓库(如果有私服的话)。
- ③、如果私服没有,判断是否配置了镜像,如果配置了镜像,就去镜像那儿拿,如果没有没有配置镜像,就从中央仓库那拿。
- ④、如果中央仓库也没有,就抛出异常,坐标不对。
所以, Maven的各个仓库的优先级是:本地仓库 > 私服 > 远程仓库
Maven的一个核心的作用就是管理项目的依赖
,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能才其它项目中进行依赖引用。坐标的定义元素如下:
- groupId:公司或组织域名倒序
- artifactId:模块名
- version:版本号
构成了一个Jar包的坐标(简称gav)
例如:要引入junit的测试jar,只需要在pom.xml配置文件中配置引入junit的坐标即可:
mysql
mysql-connector-java
5.1.26
org.springframework
spring-core
4.0.9.RELEASE/
二、 Maven的安装和优化配置
2.1 下载Maven
Maven的下载地址为:https://maven.apache.org/download.cgi
点击apache-maven-3.6.3-bin.zip下载。这里当然选择的是最新的版本,下载成功之后,在电脑上解压。
解压后的文件目录如下所示: 下面介绍一下各个文件的作用:
- bin目录:包含 maven运行时的脚本, 这些脚本用来配置Java命令,准备好 classpath和相关的java系统属性。 其中:mvn 是UNIX平台的
- shell脚本, mvn.cmd 是Windows平台的 bat脚本, mvcDebug 是UNIX的调试脚本, mvcDebug.cmd 是Windows平台的 调试脚本。
- boot目录:包含两个文件。 其中plexus-classworlds-2.6.0.jar ,是一个类加载器框架。Maven可以使用它,来加载自己的类库。
- conf目录:是配置文件目录,其中有一个 settings.xml 文件,用来配置maven。还有一个 logging文件,日志记录,来配置日志的相关信息。
- lib目录:maven运行时,所需要的类库。 里面放置了大量的 .jar 类库及对应的软件许可证 .license.
- LICENSE:Maven使用的软件许可证。
- NOTICE:Maven包含的第三方软件
- README.txt:Maven的简单介绍,包括安装需求和安装的简要指令。
注意:Maven是依赖于JDK的,所以我们在安装 Maven之前,电脑上必须先安装 JDK。
首先右击此电脑—>属性—>高级系统设置—>高级—>环境变量。
①、新建系统变量:MAVEN_HOME。变量值:D:\Maven\apache-maven-3.6.3(这是你Maven的存储路径)
②、编辑系统变量:Path。添加变量值:%MAVEN_HOME%\bin。其中“%MAVEN_HOME%\bin”代表的就是”D:\Maven\apache-maven-3.6.3\bin“目录。
③、检验配置是否成功:用win键+R,输入cmd进入dos命令,输入mvn -v,出现如下信息则表明成功!
①、修改本地仓库位置。
Maven管理的jar包默认是存储在C盘用户目录下的 .m2 下的repository中。 可以更改maven的位置:
首先我们找到解压的Maven文件,然后打开conf目录下的setting.xml。
大概在55行左右我们加入如下配置文件:
D:/Maven/maven-repository
②、修改镜像源。
Maven默认下载jar包是从中央仓库下载的,所以我们在国内下载jar包是非常非常的慢,所以我们需要改一下,这里推荐阿里云的仓库。
大概在setting.xml中的第159行左右我们加入如下配置文件:
nexus-aliyun
nexus-aliyun
http://maven.aliyun.com/nexus/content/groups/public
central
③、修改Maven默认的JDK版本。 自己电脑上安装的什么版本的JDK我们就设置对应的JDK版本就可以了。
大概在setting.xml中的第218行左右我们加入如下配置文件:
jdk-1.8
1.8
true
1.8
1.8
1.8
三、 IDEA创建Maven工程
此过程比较简单, 参考链接 : IDEA搭建Maven工程
四、 Maven的生命周期和常用命令 4.1 Maven的生命周期Maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。
Maven有三套相互独立的生命周期,分别是clean、default和site。其中每个生命周期都包含一些阶段(phase),阶段是按顺序执行的,且后面的阶段依赖于前面的阶段
。执行某个阶段时,其前面的阶段会依顺序执行,但不会触发另外两套生命周期中的任何阶段。
Maven的三套生命周期:
- clean生命周期(项目清理生命周期):对在进行构建之前进行的一些清理工作。clean
- default生命周期(默认生命周期):构建的核心部分,编译、测试、打包、安装、部署等等。compile test package install deploy
- site生命周期(生成站点生命周期):生成项目报告,站点,发布站点。site
注意:由于这三个阶段的生命周期都是相互独立的,所以不能看成一个整体。但可以同时直接运行 mvn clean install site 这三套生命周期。
因为Maven的生命周期是抽象的,所以生命周期不做任何实际的工作,实际任务由插件来完成。
Default生命周期(Default Lifecycle)Default Lifecycle是构建的核心部分,编译,测试,打包,部署等等,Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中
注意:在一个生命周期中,当运行某个阶段的时候,它之前的所有阶段都会被运行,而且不需要额外去输入前面的阶段
。下面举例说明一下:
①、执行mvn clean:调用clean生命周期的clean阶段,实际执行pre-clean和clean阶段。
②、执行mvn test:调用default生命周期的test阶段,实际执行test以及之前所有阶段。
③、执行mvn clean install:调用clean生命周期的clean阶段和default的install阶段,实际执行pre-clean和clean,install以及之前所有阶段。
然后下面举第②个例子:执行mvn test。 在IDEA中执行test命令:
前面说了Maven的命令是有各自对应的插件去完成。我们看到红色框的部分,有三个不同类型的Plugin。第一个maven-resources-plugin:3.0.2是用来处理资源文件的,第二个maven-compiler-plugin:3.8.0是用来编译文件的。第三个maven-surefire-plugin:2.22.1是用来测试文件的。它们的具体会在后面介绍。
4.1 常用命令通过上面对maven的生命周期的分析,可以总结出maven中常用的命令有:clean、compile、test、package、install。所以下面我们讲讲这几个常用的 Maven 命令。首先我们先创建一个Maven项目。并且在里面添加一些代码用来测试。
在 src/main/java新建类 HelloMaven.java:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HelloMaven {
private String name;
private Integer age;
}
在 src/test/java新建中创建测试类 TestMaven.java
public class TestMaven {
@Test
public void testMaven() {
HelloMaven hm = HelloMaven.builder().name("lucky").age(24).build();
System.out.println(hm);
}
}
pom.xml 文件引入JUnit依赖如下:
junit
junit
4.11
test
clean
将之前编译的文件删除。
我们首先运行一下程序,让它生成target文件。 然后再运行clean命令。在IDEA的右侧栏找到Maven Projects(如果没有则在菜单栏找到View—>第一行Tool Windows—>Maven Projects)。
双击clean命令 这时,控制台打印输出:
这时,再看一下工作空间,target文件夹被删除了。
编译项目,并将编译的文件放在target目录
双击compile命令。这时,控制台打印输出:
再看一下工作空间,生成了 target文件夹。
点击 target文件夹, 不仅仅有 classes文件夹,里面放置包名/HelloMaven.class ,还生成了其他的文件夹。
使用单元测试框架运行测试代码(编写在test包中的代码)
双击test命令。这时,控制台打印输出:
再看一下工作空间,target 除了刚才的那些文件夹之外,又添加了几个。 test-classes,,里面放置了 包名/HelloTest.class。
对项目进行打包,放在target目录中
双击package命令。这时,控制台打印输出:
再看一下工作空间,target 除了刚才的那些文件夹之外,又多了一个 项目名-版本-快照.jar包。
将包安装至本地仓库,以让其它项目依赖
双击install命令。这时,控制台打印输出:
再看一下工作空间,target 相对于package来说,没有任何改变。 改变的是本地仓库。根据红框的地址找到我们安装的jar包:D:\Maven\maven-repository\com\thr\hellomaven\1.0-SNAPSHOT。里面有 jar包和相应的 pom.xml 文件,只是pom.xml 的名称变成了 jar包名.pom。
Maven生命周期是依靠各种插件来完成的,而我们打开Maven的源文件并没有发现有plugin,这是因为我们在第一次使用Maven的时候它会给我们自动下载,还记得在第一次配置并且运行Maven项目的时候,加载的时间有点长,输出界面也一直在下载东西,此时就在下载我们的插件。所以我们是可以找的下载的插件的,定位到:%本地仓库%\org\apache\maven\plugins,可以看到一些下载好的插件:
①、插件的目标(Plugin Goals)
一个插件通常可以完成多个任务,每一个任务就叫做插件的一个目标。如执行mvn compile命令时,此时的 compile 就是一个目标,调用的插件和执行的插件目标如下:
②、插件如何与生命周期进行绑定?
插件与生命周期绑定是通过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。如:将maven-compiler-plugin插件的compile目标绑定到default生命周期的compile阶段,完成项目的源代码编译:
③、内置的绑定
Maven对一些生命周期的阶段(phase)默认绑定了插件目标,因为不同的项目有jar、war、pom等不同的打包方式,因此对应的有不同的绑定关系,其中针对default生命周期的jar包打包方式的绑定关系如下:
第三列中【插件:目标】,其中冒号后面即是绑定的插件目标,冒号前面是插件的前缀(prefix),是配置和使用插件的一种简化方式。详细可查看Maven官方文档:Plugin Prefix。
④、自定义绑定
用户可以根据需要将任何插件目标绑定到任何生命周期的阶段,如:将maven-source-plugin的jar-no-fork目标绑定到default生命周期的package阶段,这样,以后在执行mvn package命令打包项目时,在package阶段之后会执行源代码打包。
org.apache.maven.plugins
maven-source-plugin
2.2.1
attach-source
package
jar-no-fork
……
在插件元素中,元素是执行目标,元素代表的是绑定的生命周期的阶段,元素代表要绑定的插件的目标。 插件是前面artifactId中定义好的,goals相当于该插件中的一个功能,该功能将在phase绑定的生命周期阶段执行。这种方式就属于自定义绑定,即在某个特定的生命周期阶段执行某个插件的功能,此时大多数时候是内置绑定的。
⑤、配置插件
Maven插件高度易扩展,可以方便的进行自定义配置。如:配置maven-compiler-plugin插件编译源代码的JDK版本为1.7:
org.apache.maven.plugins
maven-compiler-plugin
1.7
1.7
UTF-8
- source: 源代码编译版本;
- target: 目标平台编译版本;
- encoding: 字符集编码。