Maven 之整体介绍

500 阅读5分钟

Maven 之整体介绍

参考:

Maven

mvn仓库

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.configjvm.configextensions.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依赖的引用路径 依赖管理-仓库

image.png

  • 依赖下载流程

image.png

  • 本地仓库
    Maven本地仓库,主要用于存储Maven项目需要的依赖信息,供本地项目运行使用。
  • 远程仓库 Maven项目下载依赖的远程仓库(可以是内网部署的私服、也开始是第三方、官方部署的仓库)。

依赖冲突管理

  • 依赖传递

image.png

  • 依赖冲突排查 使用诸如IDEA中提供的maven/show dependencies 进行依赖关系图查看,基于依赖关系图可以看到各个依赖的关系、或使用命令mvn dependency:tree image.png 使用诸如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 生命周期插件

plugins

插件仓库

  • 官方插件

Core plugins

image.png Packaging types/tools

image.png Reporting plugins

image.png Tools

image.png