一、简介
Apache Maven 是一个(特别是Java编程)项目管理及自动构建工具,由Apache软件基金会所提供。
基于项目对象模型(缩写:POM)概念,Maven 利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
-
官方网址:https://maven.apache.org
-
下载地址:https://maven.apache.org/download.cgi
-
依赖仓库:https://mvnrepository.com
1.1、作用
传统项目管理现状分析:jar 包不统一,jar 包不兼容,工程升级维护过程操作繁琐 …
-
项目构建:提供标准的、跨平台的自动化项目构建方式。
-
依赖管理:方便快捷的管理项目依赖,避免依赖之间的版本冲突问题。
-
开发结构:提供标准的、统一的项目结构。
1.2、仓库
概念: 用于存储资源,包含各种 Jar 包。
- 本地仓库: 自己电脑上存储资源的仓库,连接远程仓库获取资源。
- 远程仓库: 非本机电脑上的仓库,为本地仓库提供资源。
- 中央仓库: Maven 团队维护,存储所有资源 (开源) 的仓库。
- 私服仓库: 部门或公司范围内存储资源的仓库,从中央仓库获取资源。
- 私服作用:
- 保护具有版权的资源,包含购买或自主研发的 jar。
- 一定范围内共享资源,仅对内部开放,不对外共享。
1.3、坐标
坐标用于描述仓库中资源的位置。其作用为使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。
主要组成:
- groupid:定义当前项目隶属组织名称,通常是域名反写,例如:org.mybatis 。
- artifactid:定义当前项目名称,通常是模块名称,例如 CRM、EMP 。
- version:定义当前项目版本号。
二、软件安装
下载地址:https://maven.apache.org/download.cgi
Maven 是绿色版软件,解压即安装,下载完毕后解压到指定目录即可。
环境要求: 依赖 Java,需要配置 JAVA_HOME,Maven 3.× 建议 JDK1.7+ 。
环境配置:
- 新建一个系统变量,变量名:MAVEN_HOME,变量值:D:\Maven\apache-maven-3.8.3
- 编辑Path系统变量,新建行:%MAVEN_HOME%\bin
测试安装: CMD命令窗口输入 mvn -v 能够正确输出版本信息则安装成功。
三、项目结构
四、依赖管理
4.1、依赖配置
依赖是指当前项目运行所需的 jar 包,一个项目可以配置多个依赖,配置依赖只需知道依赖的 Maven 坐标即可。
Maven 坐标指:groupid(组织ID)、artifactid(项目ID)、version(版本号)。
<project>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
其它依赖...
</dependencies>
</project>
4.2、依赖原理
中央仓库地址:https://repo.maven.apache.org/maven2/
坐标拼接格式:/{groupId}/{artifactId}/{version}/{artifactId}-{version}.jar
仓库地址+坐标拼接 = 下载地址:https://repo.maven.apache.org/maven2/org/mybatis/mybatis/3.5.9/mybatis-3.5.9.jar
4.3、依赖传递
好处: 可以传递的依赖不必在每个模块中都重复声明,在“最下面”的工程中依赖一次即可。
传递性:
- 直接依赖:在当前项目 pom 文件中配置的依赖。
- 间接依赖:在当前项目 pom 文件中配置了依赖 A,A 又依赖 B,则 B 为间接依赖。
冲突问题:
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。
- 声名优先:当资源在相同层级时,配置顺序靠前的覆盖配置顺序靠后的。
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。
4.4、可选依赖
当前依赖是否对外显示,在依赖中通过配置 optional 标签,true / false 设置是否向下传递。
示例:A 项目 junit 依赖添加 optional 标签并且值设为 true,此时当 B 项目引入 A 项目时,看不到 A 项目下的 junit 依赖。
<!-- A项目依赖 -->
<dependencies>
<!-- 可选依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<optional>true</optional>
</dependency>
其它依赖...
</dependencies>
4.5、排除依赖
主动排除依赖,在依赖中通过配置 exclusions 标签,指定被排除依赖的组织ID和项目ID即可。
示例:A 项目配置了 junit 依赖,junit 依赖本身又依赖了 hamcrest-core 依赖,此时不用 hamcrest-core 依赖,通过 exclusions 标签并指定组织ID和项目ID将其排除。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 排除依赖 -->
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
其它依赖...
</dependencies>
4.6、依赖范围
依赖的 jar 包默认情况可以在任何地方使用,可以通过 scope 标签设定其作用范围。
主程序(main 文件夹范围内有效)、测试程序(test 文件夹范围内有效)、是否打包(package 指令范围内)。
scope | 主程序 | 测试程序 | 打包 | 示例 |
---|---|---|---|---|
compile(默认) | √ | √ | √ | log4j |
test | √ | junit | ||
provided | √ | √ | servlet-api | |
runtime | √ | jdbc |
带有依赖范围的资源进行依赖传递时,作用范围将受到影响。
五、常用命令
命令:
-
清理:mvn clean
-
编译:mvn compiler
-
编译测试源码:mvn test-compile
-
测试:mvn test
-
打包:mvn package
-
安装:mvn install
-
部署:mvn deploy
参数:
- -DskipTests:不执行测试用例,但编译测试用例类。
- -Dmaven.test.skip=true:不执行测试用例,也不编译测试用例类。
使用:
- mvn 命令 … [参数]
六、生命周期
- 清理:清理上次的编译结果并为下次编译做准备。
- 编译:源代码编译在此阶段完成。
- 测试:使用单元测试框架运行测试后以标准格式记录和展示测试结果。
- 打包:创建 jar 或 war 包。
- 安装:安装打包的项目到本地仓库。
- 部署:拷贝最终的项目包到远程仓库中或部署到服务器。
当执行相应命令时,会依次从左往右执行对应操作:
操作 | 编译 | 测试 | 打包 | 安装 | 发布 |
---|---|---|---|---|---|
mvn compile | √ | ||||
mvn test | √ | √ | |||
mvn package | √ | √ | √ | ||
mvn install | √ | √ | √ | √ | |
mvn deploy | √ | √ | √ | √ | √ |
运行任何一个阶段的时候,它前面的所有阶段都会被运行。例如我们运行安装的时候,代码会被 编译,测试,打包,最后安装打包的项目到本地仓库。