一、概述
Maven基于项目对象模型(POM),可以通过小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。简单来说,Maven可以帮助我们更加有效的管理项目,提供了仓库的概念帮助管理第三方的jar包,最大可能的避免由于环境配置的不同所产生的问题。
Maven的下载地址:maven.apache.org,下载后解压。
bin目录包含mvn运行脚本,boot目录包含类加载器的框架,maven使用其加载自己的类库;conf下面是配置文件;lib目录下包含了maven运行时所用到的类库。
1. 环境配置
//打开系统环境变量配置,添加系统变量:
M2_HOME:D:\Maven\maven
Path:...;%M2_HOME%\bin
配置好后,在命令行中输入命令mvn -v
,能出现相关版本信息则代表maven配置成功。
2. maven目录结构
3. maven常用构建命令
mvn -v:查看maven版本
mvn compile:编译项目
mvn test:测试
mvn package:打包项目
mvn clean:删除target(target中存放项目经过编译的字节码文件和测试报告)
mvn install:安装jar包到本地仓库
4. 自动建立目录骨架
maven提供了archetype插件,用于创建符合maven规定的目录骨架
按照提示输入项目的详细信息:
或者使用命令
mvn archetype:generate -DgroupId=.. -DartifactId=... -Dversion=1.0.0SNAPSHOT -Dpackage=...
二、详情
1. 坐标与仓库
坐标:Maven中任何一个依赖,插件,项目构建的输出都可以被称为构件,构件通过坐标作为其唯一标识。其中groupId,artifaceId,version组成项目的基本坐标。
仓库:管理项目依赖。分为本地仓库和远程仓库,在本地仓库中未找到需要的构件就回去远程仓库中查找并下载到本地仓库。
镜像仓库:Maven中央仓库服务器位于国外,访问国内的镜像仓库会更快更稳定。在conf下的settings中可以找到mirrors配置镜像仓库。
maven从远程仓库中下载构件默认是存放在当前用户目录中C:\Users\DW\.m2\repository
,可以通过修改settings中的进行修改
2. maven生命周期与插件
完整项目构建过程:清理、编译、测试、打包、集成测试、验证、部署
maven生命周期:
对于maven而言,没有执行任务的功能,它的下载包也非常小,maven中的所有命令也是调用插件实现,maven官网中提供了很多的插件。在项目的pox.xml中可以添加如下配置增加插件,source插件是将源码进行打包,绑定source到default生命周期中的package阶段,其中运行目标可以在官网中查找。
3. pom.xml元素解析
pom.xml是maven项目的核心管理文件,用于项目描述,组织管理,依赖管理和构建信息管理。
<project> //根元素,包含pom的约束信息
<modelVersion> //固定版本,也是必须的元素,指定了当前pom的版本
//坐标信息
<groupId>//主项目标识,定义maven属于哪个实际的项目(组织名+项目名)
<artifaceId>//实际项目中的一个模块(项目名+模块名)
<version>//版本号一般由三个数字组成,snapshot快照,alpha内测,beta公测,release稳定,GA正式发布
<packaging>//打包类型,默认是jar,也可以是var zip pom
<name>//项目描述名
<url>//项目地址
<description>//项目描述
<developers>//开发人员
<licenses>//许可证
//依赖列表
<dependencies>
<dependency>
<groupId>
<artifactId>
<version>
<type>
<scope>//依赖范围
<optional>//设置依赖是否可选,默认false
<exclusions>//排除依赖传递列表
//依赖管理
<dependencyManagement>
<dependencies>//并不会引入到实际依赖,主要用在父模块中
//为构建行为提供相应支持
<build>
<plugins>//插件列表
<plugin>
<groupId>
<artifactId>
<version>
<parent>//在子模块中对父模块pom的继承
<modules>//聚合运行多个的maven项
4. 依赖
(1)、依赖范围
控制依赖和classpath的关系,maven提供了三种classpath:编译、测试、运行。
6种范围
compile:默认范围,编译运行测试都有效
provided:编译测试时有效
runtime:测试和运行时有效
test:测试时有效
system:同provided相同,但与本地系统相关联,可移植性差
import:导入的范围,只使用在dependencyManagement中,表示从其他pom导入dependency配置
(2)、依赖传递
依赖具有传递性,A依赖B,B依赖C,并没有让A依赖C,但是C会传入到A的依赖目录中。可以在<dependency>
添加子元素<exclusions>
除去传递依赖
(3)、依赖冲突
A和B依赖了不同版本的相同构建,那么依赖于A、B的C来说究竟依赖哪个版本的构建?
有两个选择:短路优先,先声明优先(路径长度相同)
5. 继承与聚合
多个项目install安装到本地仓库中,必须依次执行install,而Maven提供了聚合的方式将其放在一起运行。
新建一个Maven项,修改其packaging为pom,使用<modules>
引入多个Maven项再install。
可以将多个项的共同特性抽象成一个父项,将<dependencies>
中的东西放入<dependencyManagement>
中,再在子类中添加<parent>