Maven基础篇
Maven简介
- Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
- POM(Project Object Model):项目对象模型,将一个项目以对象的形式进行管理
Maven的作用
- 项目构建:提供标准的、跨平台的自动化的项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
各目录存放资源类型说明:
src/main/java
:项目java源码src/main/resources
:项目的相关配置文件(比如mybatis配置,xml映射配置,自定义配置文件等)src/main/webapp
:web资源(比如html,css,js等)src/test/java
:测试代码src/test/resources
:测试相关配置文件target
:项目输出位置,编译后的class文件会输出到此目录pom.xml
:项目pom文件
Maven的下载与安装
Maven的下载
下载链接:http://maven.apache.org/download.cgi
Maven的安装
Maven属于绿色版软件,解压即安装,
Maven解压后目录结构如下:
bin
:存放了maven的命令boot
:存放了maven本身的引导程序,如类加载器等conf
:存放了maven的配置文件,如setting.xml文件lib
:存放了maven本身运行所需的jar包
Maven的环境变量配置
Maven的运行需要java的环境,需要配置JAVA_HOME
的环境变量,之后新建MAVEN_HOME
,值为Maven安装的目录(bin目录之前的一级目录)。
环境变量配置好之后需要测试环境配置结果,在终端命令窗口输入mvn -v
命令,如果能够看到输出的Maven的版本信息代表配置成功。
Maven基础概念
仓库
仓库:仓库用于存储资源,包含各种jar包。
仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
- 中央仓库:由Maven团队维护,存储所有资源的仓库,服务于整个互联网,Maven中内置一个远程仓库地址https://repo.maven.apache.org/maven2/
- 私服:部门/公司范围内存储资源的仓库
私服的作用:
- 保存具有版权的资源,包含购买或自主研发的jar。
- 中央仓库的jar都是开源的,不能存储具有版权的资源。
- 一定范围内共享资源,仅对内部开放,不对外共享。
坐标
坐标:描述仓库中资源的位置。
坐标的主要组成:
- groupId(组织ID):定义当前maven项目所属组织名称(通常是域名的反写,例如:org.mybatis)
- artifactId(项目ID):定义当前maven项目名称(通常是模块名称,例如CRM、SMS)
- version(版本号):定义当前项目版本号
- packaging:定义当前项目打包方式。这不是maven的组成部分,但是需要使用,取值一般有如下三种
- jar:该资源打成jar包,默认是jar
- war:该资源打成war包
- pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个pom.xml不生成jar或其他包结构
Maven坐标的作用:
- 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。
如果要查询maven某一个资源的坐标,通常可以去maven的仓库进行查询,在https://mvnrepository.com网站中可搜索想要的资源,然后得到该资源的坐标。
pom基本配置
pom.xml是Maven项目的核心配置文件,位于每个工程的根目录,基本配置如下:
标签 | 说明 |
---|---|
<project> |
文件的根节点 |
<modelversion> |
pom.xml使用的对象模型版本 |
<groupId> |
项目名称,一般写项目的域名 |
<artifactId> |
模块名称,子项目名或模块名称 |
<version> |
产品的版本号 |
<packaging> |
打包类型,一般有jar、war、pom等 |
<name> |
项目的显示名,常用于Maven生成的文档 |
<description> |
项目描述,常用于Maven生成的文档 |
<dependencies> |
项目依赖构件配置,配置项目依赖构件的坐标 |
<build> |
项目构建配置,配置编译、运行插件等。 |
本地仓库配置
Maven启动后,会自动保存下载的资源到本地仓库。
在%MAVEN_HOME%/conf/settings.xml
文件中配置本地仓库位置
- 默认位置
<localRepository>${user.home}/.m2/repository</localRepository>
- 路径为
C:\用户\用户名\.m2\repository
- 自定义位置
<localRepository>D:\maven\repository</localRepository>
- 路径为
D:\maven\repository
远程仓库配置
在安装目录下的conf/settings.xml
文件中找到<mirrors>
标签,在标签内添加以下内容
1 | <mirrors> |
全局配置和用户配置
maven仓库地址、私服等配置信息需要在setting.xml文件中配置,分为全局配置和用户配置
- 全局配置,定义了当前计算机中maven的公共配置,对任何版本的maven都生效。
- 在 maven安装目录下的
conf/setting.xml
文件,此文件用于maven的所有project项目,它作为maven 的全局配置。
- 在 maven安装目录下的
- 用户配置,定义了当前用户的配置。
- 用户配置的setting.xml文件默认的位置在:
${user.dir}/.m2/settings.xml
目录中,${user.dir}
指windows中的用户目录。
- 用户配置的setting.xml文件默认的位置在:
- maven会先找用户配置,如果找到则以用户配置文件为准,否则使用全局配置文件。
Maven项目构建命令
maven的构建命令以mvn
开头,后面添加功能参数,可以一次性执行多个命令,用空格分离
命令 | 功能 | 说明 |
---|---|---|
mvn compile |
编译 | 作用是将src/main/java 下的文件编译为class文件输出到target 目录下 |
mvn clean |
清理 | 作用是删除target 目录及内容 |
mvn test |
测试 | 作用是执行src/test/java 下的单元测试类 |
mvn package |
打包 | 作用是将java工程执行package打成jar包,对于web工程打成war包 |
mvn install |
安装到本地仓库 | 作用是将maven打成jar包或war包发布到本地仓库。 |
Maven项目构建生命周期
maven对项目构建的生命周期划分为三套相互独立的生命周期,分别是:
Clean Lifecycle:在进行真正的构建之前进行一些清理工作
Default Lifecycle:构建的核心部分,编译,测试,打包,部署等
Site Lifecycle:生成项目报告,站点,发布站点
clean生命周期
命令 | 功能 |
---|---|
pre-clean |
执行一些需要在clean之前完成的工作 |
clean |
移除所有上一次构建生成的文件 |
post-clean |
执行一些需要在clean之后立刻完成的工作 |
default生命周期
命令 | 功能 | 说明 |
---|---|---|
validate |
校验 | 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 |
initialize |
初始化 | 初始化构建状态,比如设置属性值。 |
generate-sources |
生成源代码 | 生成包含在编译阶段中的任何源代码。 |
process-sources |
处理源代码 | 处理源代码,比如说,过滤任意值。 |
generate-resources |
生成资源文件 | 生成将会包含在项目包中的资源文件。 |
process-resources |
处理资源文件 | 复制和处理资源到目标目录,为打包阶段最好准备。 |
compile |
编译 | 编译项目的源代码。 |
process-classes |
处理类文件 | 处理编译生成的文件,比如说对Java class文件做字节码改善优化。 |
generate-test-sources |
生成测试源代码 | 生成包含在编译阶段中的任何测试源代码。 |
process-test-sources |
处理测试源代码 | 处理测试源代码,比如说,过滤任意值。 |
generate-test-resources |
生成测试资源文件 | 为测试创建资源文件。 |
process-test-resources |
处理测试资源文件 | 复制和处理测试资源到目标目录。 |
test-compile |
编译测试源码 | 编译测试源代码到测试目标目录。 |
process-test-classes |
处理测试类文件 | 处理测试源码编译生成的文件。 |
test |
测试 | 使用合适的单元测试框架运行测试(Juint是其中之一)。 |
prepare-package |
准备打包 | 在实际打包之前,执行任何的必要的操作为打包做准备。 |
package |
打包 | 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 |
pre-integration-test |
集成测试前 | 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 |
integration-test |
集成测试 | 处理和部署项目到可以运行集成测试环境中。 |
post-integration-test |
集成测试后 | 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 |
verify |
验证 | 运行任意的检查来验证项目包有效且达到质量标准。 |
install |
安装 | 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 |
deploy |
部署 | 将最终的项目包复制到远程仓库中与其他开发者和项目共享。 |
site生命周期
命令 | 功能 |
---|---|
pre-site |
执行一些需要在生成站点文档之前完成的工作 |
site |
生成项目的站点文档 |
post-site |
执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 |
site-deploy |
将生成的站点文档部署到特定的服务器上 |
插件
- 插件与生命周期内各阶段的指令绑定,在执行相应命令的时候其实就是运行的插件。
- maven默认在各个生命周期上都绑定有预设的功能。
- 也可以通过插件自定义功能。
1 | <!-- 构建,配置插件 --> |
Maven概念模型
Maven包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段 (phase)中插件(plugin)、目标(goal)的逻辑。
- 项目对象模型(Project Object Model)
- 一个maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等
- 依赖管理系统(Dependency Management System)
- 通过maven的依赖管理对项目所依赖的jar包进行统一管理
- 一个项目生命周期(Project Lifecycle)
- 使用maven完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven将这些过程规范为一个生命周期
- maven通过执行一些简单命令即可实现生命周期的各个过程,比如执行
mvn compile
执行编译、 执行mvn clean
执行清理
- 一组标准集合
- maven将整个项目管理过程定义一组标准,比如通过maven构建工程,有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等
- 插件(plugin)、目标(goal)
- maven管理项目生命周期过程都是基于插件完成的
依赖管理
依赖配置
依赖指在当前项目运行所需的jar,一个项目可设置多个依赖
格式:
1 | <!-- 设置当前项目的所有依赖 --> |
依赖传递
依赖具有传递性(相当于继承性):
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
- 间接依赖:被依赖的资源如果依赖其他的资源,即当前项目间接依赖其他资源
依赖冲突问题
- 当前项目和被依赖的项目中存在相同的依赖时,会存在冲突,比如版本不同。
- 当出现冲突时,会根据优先级选择使用哪个依赖。
- 路径优先:依赖层级越深,优先级越低。即直接依赖优先级高于间接依赖。
- 声明优先:在maven中声明靠前的会覆盖靠后的。
- 特殊优先:在同级配置中,相同资源的不同版本,声明靠后的会覆盖靠前的。
可选依赖
可选依赖是指对外隐藏当前所依赖的资源
1 | <denpendency> |
排除依赖
排除依赖是指主动断开依赖的资源,被排除的依赖无需指定版本
1 | <denpendency> |
依赖范围
依赖的jar默认情况可以在任何地方使用,可以通过scope
标签设定其作用范围
作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
scope | 主代码 | 测试代码 | 打包 | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
provided | Y | Y | servlet-api | |
runtime | Y | jdbc | ||
test | Y | junit |
依赖范围的传递性:
带有依赖范围的资源在进行传递时,作用范围将受到影响
依赖范围由强到弱的顺序是:compile>provided>runtime>test
假如当前项目为A和B,A依赖于B(需要在 A 的pom.xml文件中添加 B 的坐标),其依赖范围如下:
compile | provided | test | runtime | |
---|---|---|---|---|
compile | compile | provided | test | runtime |
provided | provided | |||
runtime | runtime | provided | test | runtime |
test |
表格的第一行是直接依赖,即A项目中配置的,第一列是间接依赖,即B项目中配置的,交叉的格子是B在A中的依赖范围