内容转载自:https://blog.youkuaiyun.com/u010425776/article/details/52027706
什么是Maven?
简单来说,Maven就是一款帮助程序员构建项目的工具,他会帮我们管理jar包。管理项目的生命周期。
基本命令?
-v : 查询maven版本。
compile:编译
将java源文件编译成class文件
test:测试项目
执行test目录下的测试用例
package:打包
将项目打包成jar或者war包
clean:
删除target文件夹
install:
将当前项目放到Maven的本地仓库中。供其他项目使用。
在maven中,坐标是jar包的唯一标识,maven通过坐标在仓库找到项目所需的jar包。
groupId:所需jar包的项目名,artifactId:所需jar包的模块名,version:所需jar包的版本号。
若多个项目中多个jar同时引入了相同的jar时,会产生依赖冲突,Maven采用了两种策略避免冲突:
短路优先:
声明优先:
若引用路径长度相同,在pom文件中谁先被声明,就使用谁。
聚合:
将多个项目作为module引入到pom文件中即可。
dependencyManagement
只能出现在父pom里
统一版本号
只是声明依赖,并不直接引入依赖,需要时在子项目中生命需要使用的依赖的groupId,artifactId信息,version可以省略。
scope
compile:编译依赖范围,在编译,测试,运行时都需要,依赖范围默认值
test:测试依赖范围,测试时需要。编译和运行不需要,如junit
provided:已提供的依赖范围,编译和测试时需要,运行时不需要,如servlet-api
runtime:运行时依赖范围,测试和运行时需要。编译不需要,例如面向接口编程,JDBC驱动实现jar
system:系统依赖范围,本地依赖,不在maven中央仓库。
依赖排除
使用exclusions来排除不需要使用jar。
依赖关系查看
mvn dependency:tree 命令会列出依赖关系树及各级依赖关系
mvn denpendency:analyze 分析依赖关系
maven的版本号常见有两种,一种是以-RELEASE 结尾,一种是以-SNAPSHOT几位。在企业私服中,会存在
snapshot快照仓库和release发布仓库,snapshot快照仓库用于保存开发过程中的不稳定版本,release仓库则是
用来保存稳定的发型版本。
maven会根君模块的版本号(pom文件中的version)是否带有-SNAPSHOT来判断是快照版本还是正式版本,根据
这个来判断是发布到快照仓库还是正式仓库中。
parent:模块间根据这个标签进行继承关系。
dependencyManagement 只进行版本管理,不会引入实际的jar包,而dependency则会下载实际的jar包。
jar包版本判断的两种路径:
如果dependencies里的dependency自己没有声明version元素,那么maven就会到denpendencyManagement里面去找有没有
对该atrifactId和groupId进行过声明,如果有就继承他,如果没有就会报错。
如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
dependency中还引入了scope,主要管理依赖的部署:
compile:缺省值,适用于所有阶段,会随着项目一起发布。
provided:类似于compile,期望JDK,容器或使用者会提供这个依赖,如servlet.jar。因为这个servlet.jar会在容器里或者tomcat里存在,这个jar不会被打包。
runtime:只在运行时使用,如JDBC驱动,适用于运行和测试阶段。
test:只用在测试阶段,不会随项目发布。
system:类似provided,需要显式提供包含依赖的jar,maven不会再仓库里查找他。