1.课程概述
- 慕课网教程地址 https://www.imooc.com/learn/443
1.1 maven快速入门
- 介绍
- maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。
- maven可以帮助我们更有效的管理项目,是一套强大的自动化构件工具,覆盖了编译、测试、运行、清理、打包、布置整个项目构建的周期。它提供了一个仓库的概念,统一管理项目所依赖的第三方jar包。
- 环境搭建
- 首先下载maven的zip压缩包:官方下载地址
- 下载后解压到任意目录。
- 配置环境变量
- 新增系统变量
M2_HOME
,变量值为maven的安装目录,如D:\Java\apache-maven-3.3.9
- 在环境变量
Path
中添加;M2_HOME\bin
- 新增系统变量
- 在cmd中执行
mvn -v
,如果出现maven版本信息则代表maven安装成功。
2.maven核心知识
2.1 常用的构建命令
mvn -v
查看maven版本mvn compile
编译mvn test
测试mvn package
打包mvn clean
删除targetmvn install
安装jar包到本地仓库中
2.2 maven中的坐标和仓库
- 坐标
- maven中的任何一个依赖、插件、项目构建的输出,都可以被称为“构件”,所有构件均通过坐标作为唯一标识。
<groupId>、<artifactId>、<version>
是构件的基本坐标,基本坐标是构件唯一的标识。
<dependency> //groupId为公司网址反写+项目名 <groupId>com.imooc.maven01</groupId> //artifactId项目名-模块名 <artifactId>maven01-model</artifactId> //version是构件的版本号 <version>0.0.1SNAPSHOT</version> </dependency>
- 仓库
- 仓库就是用来管理项目的依赖的,仓库分为两种,本地仓库和远程仓库。
- 如果maven在本地仓库中找不到需要的构件,则它回去maven的远程中央仓库中查找。查找到之后会下载到本地仓库中供我们使用。如果远程仓库找不到需要的构件,就会报错。
- 国内镜像仓库
- maven的中央仓库不稳定,就需要更换国内镜像仓库。
- 在
settings.xml
文件中的<mirrors>
标签内增加如下标签:
<mirror> <id>maven.net.cn</id> <mirrorOf>cenral</mirrorOf> <name>central mirror in chian</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror>
- 仓库的路径
- maven从远程仓库下载的构件,默认存放在当前用户目录中,比如
C:\Users\Administrator\.m2\repository
- 实际使用中,不会将仓库放在C盘中,就需要更改仓库的默认路径。
- 找到
settings.xml
文件中的<localRepository>
标签,修改如下即可:
<localRepository>D:/Java/m2</localRepository>
- maven从远程仓库下载的构件,默认存放在当前用户目录中,比如
2.3 maven的生命周期和插件
- maven的三套生命周期:
clean
清理项目default
构建项目(最核心)site
生成项目站点
- 这三套生命周期是相互独立的,每个生命周期又包含一些阶段。各个生命周期中的阶段是有顺序的,且后面的阶段依赖前面的阶段。执行某个阶段时,其前面的阶段会一起按顺序执行。但不会触发另外两套生命周期中的任何阶段。
- 比如执行
mvn package
这个阶段时,会自动依次执行mvn compile
、mvn test
。 clean
清理项目pre-clean
执行清理前的工作clean
清理上一次构建生成的所有文件post-clean
执行清理后的文件
default
构建项目(最核心)default
是生命周期中最核心的,它包含了构建项目时所包执行的步骤。阶段比较多,常用的阶段如下:compile
test
package
install
site
生成项目站点site
会根据pom中的一些信息自动生成一个站点,阶段如下:pre-site
在生成项目站点前要完成的工作site
生成项目的站点文档post-site
在生成项目站点后要完成的工作site-deploy
发布生成的站点到服务器
2.4 pom.xml常用元素介绍
- pom是maven项目的核心管理文件,用于项目描述、组织管理、依赖管理和构件信息的管理。
- 常用标签
<project>
:是pom.xml的根元素,包含了pom的一些约束信息。<modelVersion>
:是一个必须的元素,指定了当前pom的版本。- 坐标信息标签:
<groupId>
:主项目标识,一般为反写的公司网址+项目名。<artifactId>
:是模块的标识,是实际项目中的一个模块,一般为项目名+模块名。<version>
:表示当前项目的版本号。<packaging>
:是maven的打包方式,不指定时默认为jar,还可以打包成war、zip、pom等格式。
- 项目信息标签(不重要的描述标签)
<name>
:项目描述名,一般在产生项目文档时使用。<url>
:项目的地址。<discription>
:项目的描述。<developers>
:开发人员列表。<licenses>
:许可证信息。organization
:组织信息。
- 重要的标签
<dependencies>
:依赖列表,可以包含多个依赖项<dependency>
,依赖项中使用坐标来指定依赖的位置,包含的标签如下:<groupId>
<artifactId>
<version>
<type>
<scope>
:指定依赖的范围。<optional>
:默认为false,如果为false表示依赖是被子项继承的。如果为true表示子项不继承,必须显示的引入该依赖才能使用。<exclusions>
:用于排除依赖传递列表,可以排除多个依赖。比如A依赖B,B依赖C,C对于A来说就是传递依赖。如果A不想依赖C,就可以使用该标签排除对C的依赖。<dependencyManagement>
:用于依赖的管理,可以声明依赖列表,但是它并不会被运行(不会被引入到实际的依赖中),主要是用于定义在父模块中,供子模块所继承时使用。比如多个子模块都需要使用junit
,只需要在父模块中定义一次junit
即可。<build>
:为构件的行为提供支持。<plugins>
:插件列表。
<parent>
:用于在子模块中对父模块的继承。<modules>
:聚合运行多个的maven项,可以定义多个模块一起编译。
2.5 依赖范围scope
- maven中提供了三种classpath,分别是编译、测试、运行。scope依赖范围就是控制依赖与这三种classpath的关系。
- scope的值有6种:
compile
:是默认值,在编译、测试、运行都有效。provided
:在编译、测试时有效。runtime
:在测试、运行时有效。test
:只在测试时有效。system
:作用范围和provided的作用范围一样。但是system与本机系统相关联,指的是本地的引用路径,可移植性差。import
:导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependecy的配置。
2.6依赖冲突
- 当A和B都依赖了一个不同版本的相同构件,在C中同时依赖A和B时,C究竟是依赖的哪个版本的构件?
- 依赖原则:
- 短路优先:优先解析路径短的版本。
比如:A→B→C→X(jar)
和A→D→X(jar)
两种路径,会优先解析A→D→X(jar)
。 - 先声明优先:当路径相同时,优先解析
<dependencies>
中先声明的构件。
- 短路优先:优先解析路径短的版本。
2.7 聚合和继承
- 聚合
- 没有聚合时,如果想将多个maven项目通过
install
命令安装到本地仓库中,必须对多个项目依次执行install
命令。maven中有种方式可以将多个项目放在一起运行,这种方式就称为聚合。 - 新建一个maven项目,pom中实现聚合的代码如下:
<modules> <module>common</module> <module>business</module> <module>test</module> <module>api</module> <module>adm</module> </modules>
- 当对新建的maven项目执行
install
命令时,就会对<modules>
中定义的项目依次执行install
命令。
- 没有聚合时,如果想将多个maven项目通过
- 继承
- 当多个maven项目中都引用了相同的构件时,可以新建一个父级maven项目,将相同的构件放在父级的pom中统一管理。
- 在父级pom中定义共用的依赖,如下:
<dependencyManagement> <dependencies> <dependency> <groupId>com.hyx</groupId> <artifactId>hyx-common</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>com.hyx</groupId> <artifactId>hyx-business</artifactId> <version>2.0</version> </dependency> </dependencies> </dependencyManagement>
- 在子级的pom加入继承父级的代码,如下:
<parent> <groupId>com.hyx</groupId> <artifactId>hyx-parent</artifactId> <version>1.0</version> </parent>
- 这样项目就可以将父级中定义的
<dependency>
继承过来使用。