Maven 之整体介绍
参考:
Maven 是什么?
Maven 是用于构建及管理Java项目的一款项目管理工具。提供项目全生命周期管理(编译、测试、打包、发布等)及依赖统一管理等。实现统一、标准、简化Java项目的开发(多模块、复杂类型项目)。
Maven的目标
- 提供构建过程更加简便
使用 Maven 并没有消除了解底层机制的需要,但 Maven 确实为开发人员提供了许多细节的保护。
- 提供统一的构建系统
Maven 使用其项目对象模型 (POM) 和一组插件来构建项目。一旦你熟悉了一个 Maven 项目,你就会知道所有的 Maven 项目是如何构建的。这可以在浏览许多项目时节省时间
- 提供更加有用的项目信息
Maven 提供了有用的项目信息,这些信息部分来自您的 POM,部分来自您的项目源代码,如:- 项目管理的邮件列表、项目使用的依赖项、单元测试报告,包括覆盖率等
-
鼓励更好的开发实践方式
-
Maven 旨在收集最佳实践开发的当前原则,并使其易于指导项目朝该方向发展。 例如,单元测试的规范、执行和报告是使用 Maven 的正常构建周期的一部分。当前的单元测试最佳实践被用作指南:
-
将测试源代码保存在单独但并行的源代码树中
-
使用测试用例命名约定来定位和执行测试
-
让测试用例设置他们的环境,而不是为测试准备定制构建 Maven 还协助项目工作流程,例如发布和问题管理。
Maven 特点
- 依赖统一管理维护,提供诸如:本地仓库、远程仓库(私服、中央仓库)概念、方便依赖统一管理,减少依赖冲突
- 提供模块化机制,方便进行项目的模块化管理维护
- 提供项目管理生命周期控制,对各个阶段分别进行维护(如:编译、测试、打包、站点生成、发布等)的全流程管理
- 提供插件机制,在提供的生命周期上提供Hook机制,方便将官方的、第三方的、自定义的插件进行植入,方便扩展
Maven 使用
安装
- 注意当前环境的Java版本及对应的Maven版本即刻,对系统无要求
- 配置Maven环境变量
- 测试命令
mvn -v
#信息如下
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: D:\Develop\apache-maven-3.3.9\bin\..
Java version: 1.8.0_221, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_221\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
#查看支持命令
mvn --help
usage: mvn [options] [<goal(s)>] [<phase(s)>]
如:
mvn verify #查看生命周期阶段
配置
MAVEN_OPTS
环境变量配置 此变量包含用于启动运行 Maven 的 JVM 的参数,并可用于为其提供附加选项。例如,JVM 内存设置可以用 value 来定义-Xms256m -Xmx512m
setting.xml
配置 默认位于 USER_HOME/.m2 中的设置文件旨在包含跨项目使用 Maven 的任何配置,即Maven项目全局配置。- .mvn目录
位于项目的顶级目录中,文件maven.config
、jvm.config
和extensions.xml
包含用于运行 Maven 的项目特定配置。此目录是项目的一部分,可以签入到您的版本控制中
Maven 依赖管理
Maven 为了维护数据量众多的依赖资源,提供并实现坐标概念,方便快速的定位到具体需要的资源信息。 依赖坐标
<dependency>
<groupId>依赖所属组织</groupId>
<artifactId>资源名</artifactId>
<version>资源版本</version>
<type>资源类型</type>
<scope>资源依赖范围</scope>
<optional>可选项</optional>
<classifier>编译分类器</classifier>
<systemPath>引用外部资料作为maven资源使用</systemPath>
</dependency>
- type:资源类型,常见类型jar,ejb
- scope: 依赖传递范围
complie:默认值,依赖会随项目的引用并传递给引用依赖项目
provided: 与complie类似,但是只作用于编译、测试阶段有效,不会进行依赖传递
runtime: 运行阶段有效,编译阶段无效,不会进行依赖传递。
test:只作用于测试环境的依赖(即:src/test/main:目录下生效)
system:引入外部资源(maven仓库中不存在的)
- optional:是否为可选项,为true,依赖不会传递
- classifier:编译分类器,可以指明依赖资源编译时使用的版本,如xx-jdk18(使用的jdk1.8进行编译)
- systemPath: 指明外部依赖作为Maven依赖的引用路径 依赖管理-仓库
- 依赖下载流程
- 本地仓库
Maven本地仓库,主要用于存储Maven项目需要的依赖信息,供本地项目运行使用。 - 远程仓库 Maven项目下载依赖的远程仓库(可以是内网部署的私服、也开始是第三方、官方部署的仓库)。
依赖冲突管理
- 依赖传递
- 依赖冲突排查
使用诸如IDEA中提供的maven/show dependencies 进行依赖关系图查看,基于依赖关系图可以看到各个依赖的关系、或使用命令
mvn dependency:tree
使用诸如IDEA中提供的maven/show Effective POM 进行查看实际有效的POM文件。
- 依赖冲突解决方案
#1.通过依赖的加载顺序进行处理
路径最短原则
A-B-C-D(1.0) A-B-D(2.0) ===> 使用的是2.0版本的D
优先申明原则(在pom.xml文件中申明的顺序)
A-B-D(1.0)【先申明】,A-C-D(2.0)【后申明】 ===>使用的是1.0的D版本
#2.通过exclusions 进行传递依赖排查
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
Maven 生命周期插件
插件仓库
- 官方插件
Core plugins
Packaging types/tools
Reporting plugins
Tools
- 第三方插件 mojohaus插件库