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/

下载链接: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
2
3
4
5
6
7
8
9
10
11
12
13
<mirrors>
<!-- 配置镜像地址 -->
<mirror>
<!-- 镜像的唯一标识符,用来区分不同的mirror元素 -->
<id>alimaven</id>
<!-- 对哪种仓库进行镜像,也就是代替哪个仓库 -->
<mirrorOf>central</mirrorOf>
<!-- 镜像名称 -->
<name>aliyun</name>
<!-- 镜像url -->
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>

全局配置和用户配置

maven仓库地址、私服等配置信息需要在setting.xml文件中配置,分为全局配置和用户配置

  • 全局配置,定义了当前计算机中maven的公共配置,对任何版本的maven都生效。
    • 在 maven安装目录下的conf/setting.xml文件,此文件用于maven的所有project项目,它作为maven 的全局配置。
  • 用户配置,定义了当前用户的配置。
    • 用户配置的setting.xml文件默认的位置在:${user.dir}/.m2/settings.xml目录中,${user.dir}指windows中的用户目录。
  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!-- 构建,配置插件 -->
<build>
<!-- 设置插件 -->
<plugins>
<!-- 具体插件配置 -->
<plugin>
<!-- 插件仓库坐标配置 -->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 生命周期配置 -->
<executions>
<!-- 具体生命周期配置 -->
<execution>
<!-- 打包方式 -->
<goals>
<!-- 具体打包方式 -->
<goal>jar</goal>
</goals>
<!-- 执行的声明周期 -->
<phase>test</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>

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
2
3
4
5
6
7
8
9
<!-- 设置当前项目的所有依赖 -->
<dependencies>
<!-- 设置具体的依赖 -->
<denpendency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</denpendency>
</dependencies>

依赖传递

依赖具有传递性(相当于继承性):

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
  • 间接依赖:被依赖的资源如果依赖其他的资源,即当前项目间接依赖其他资源

依赖冲突问题

  • 当前项目和被依赖的项目中存在相同的依赖时,会存在冲突,比如版本不同。
  • 当出现冲突时,会根据优先级选择使用哪个依赖。
    • 路径优先:依赖层级越深,优先级越低。即直接依赖优先级高于间接依赖。
    • 声明优先:在maven中声明靠前的会覆盖靠后的。
    • 特殊优先:在同级配置中,相同资源的不同版本,声明靠后的会覆盖靠前的。

可选依赖

可选依赖是指对外隐藏当前所依赖的资源

1
2
3
4
5
6
7
<denpendency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 隐藏依赖 -->
<optional>true</optional>
</denpendency>

排除依赖

排除依赖是指主动断开依赖的资源,被排除的依赖无需指定版本

1
2
3
4
5
6
7
8
9
10
<denpendency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 排除依赖 -->
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</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中的依赖范围