关于Maven 的个人总结
一.Maven?
1.1 Maven概念
Maven是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供 。基于项目 对象模型概念,Maven利用一个中央信息片段能管理一个项目的构建,报告和文档等步骤。专注服务于Java平台的项目构建和jar包依赖管理。maven并不是一个框架,但是他其中一个功能是帮助开发者管理框架所需要的jar包使用Maven后每个jar包本身只在本地仓库中保存一份,需要jar包的工程只需要以坐标的方式简单的引用一下就可以了。不仅极大的节约了存储空间,让项目更轻巧,更避免了重复文件太多而造成的混乱。
1.2 为什么要用Maven
Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。
最主要***优势***可以总结一下三点:
生命周期管理,便捷的构建过程;
依赖管理,方便引入所需依赖 Jar 包;
仓库管理,提供统一管理所有 Jar 包的工具;
目录结构管理,提供了一套标准的目录结构(基本上所有的web项目,目录结构几乎都是相同的)
当然还有其他的优点:
插件式架构,大量的可重用插件;
很方便集成IDE;
开源项目都使用Maven
***1.3***Maven 安装
首先要安装好Java环境,然后需要下载Maven的二进制包
Maven下载地址:(http://maven.apache.org/download.cgi) 选中apache-maven-3.6.1-bin.zip,解压
配置环境变量
也可以在path中加入maven的bin目录
%MAVEN_HOME%\bin;
或者直接D:\apache-maven-3.6.1\bin总之能找到bin就行
验证maven是否安装成功
在cmd(命令提示符)输入mvn -v 出现如下图所示即安装成功
二.Maven生命周期
- maven对构建(build)的过程进行了抽象和定义,这个过程被称为构建的生命周期(lifestyle)
- 生命周期由多个阶段(phase)组成每个阶段会挂接一到多个goal
- goad是maven里定义任务的最小单元,相当于ant里的target
- 可以理解maven为一个插件的容器,每个插件绑定到某个goal执行
三.Maven基础知识
-
-1.maven坐标
-
:组织名,一般是网址的反写+项目名
:项目名
: 版本号
: 打包方式
- 2.maven常用构建命令
compile 编译
test 测试
package 打包
clean 删除target目录
install 安装jar到本地仓库中
- 3.
引入构建包的流程如下,假设本地两个maven工程A和B,其中A依赖B:
进入B工程的目录,进行mvn install。效果是将B工程编包并发布到本地仓库在项目A的pom文件中,添加对B的依赖,进入A工程目录,进行mvn compile编译即可。
- 4.maven中的坐标和仓库
在maven中,groupId,artifactId和version一起形成坐标的概念。坐标能够唯一确定jar或者pom。
maven 的仓库分为本地仓库和远程仓库。
在setting文件中,可以设置镜像仓库,提高下载速度:
groups
*http://maven.net.cn/content/groups/public/
可以更改本地仓库的存放目录:
D:/maven/lib/ - 5.maven依赖范围标签
scope标签指定的依赖范围,有3种作用域,分别是编译、测试和运行时期。
scope标签的值,有6种类型,分别是:
compile:默认值,编译测试和运行都有效
provided:编译和测试的时候有效,运行时候不生效
runtime:测试和运行时候有效
test:只在测试的时候有效
system:在编译和测试的时候有效,与本机系统关联,可移植性较差
import:导入的范围,使用在dependencyManagement标签中,表示从其他的pom中导入dependency的配置
-6. maven依赖传递
maven中的依赖具有传递性。如果项目A依赖项目B,项目B依赖项目C,那么项目A也是依赖项目C的。这一点可以在项目的依赖列表中看到。
maven中可以使用标签进行依赖排除。如下图所示,在pom中依赖了hongxing-nage,但是却排除了hongxing-nage所依赖的hongxing-bge。
-7.maven依赖冲突
所谓的依赖冲突,举例说明,工程A依赖B和C,但是B和C分别依赖不同版本的D。那么对于工程A来说,到底是依赖了哪个版本的D呢?
解决依赖冲突有2个基本的原则:
短路优先原则。 比如存在如下的两个依赖路径,那么A最终会依赖version2的X版本。
A-B-C-X(version1)
A-D-X(version2)
如果路径长度相同,那么先声明先解析。