[TOC]
Maven基础知识
核心概念
(Lifecycle)生命周期 -> (Phase)阶段 -> (Goal)目标
lifecycle是总任务,phase就是总任务分出来的子任务,但是这些子任务是被规格化的,它可以同时被多个lifecycle所包含,一个lifecycle可以包含任意个phase,phase的执行是按顺序的,一个phase可以绑定很多个goal,至少为一个,没有goal的phase是没有意义的。
Maven常用技巧
本地执行依赖检查
mvn -U clean package -Dmaven.test.skip=true enforcer:enforce -DcheckDeployRelease_skip=true -Denforcer.skip=false
强制更新依赖的包
mvn clean install -e -U
# -e 详细异常
# -U 强制更新
跳过test
-Dmaven.test.skip=true
mvn help 插件
1、 mvn help:active-profiles //列出当前构建中活动的Profile(项目的、用户的、全局的)
2、 mvn help:effective-pom //显示当前构建的实际POM,包含活动的Profile
3、 mvn help:effective-settings //打印出项目的实际 settings, 包括从全局的 settings 和用户级别 settings 继承的配置。
4、 mvn help:describe -Dplugin=Compiler -Dmojo=compile -Dfull
依赖机制介绍
依赖传递
依赖仲裁
Maven2.0只支持最短路径依赖,比如A -> B -> C -> D 2.0 和 A -> E -> D 1.0,那么在构建A时D 1.0将被采用,如果要采用D 2.0你需要在A中明确依赖D2.0。当路径深度相同时,比如A->B->D2.0 和 A->E->D1.0,2.0.8之前不确定采用哪个版本,而2.0.9版本后,采用先声明的那个版本。�依赖管理
允许作者明确指定依赖artifacts的版本,不管artifacts是通过传递依赖引入的,还是未指定artifacts的版本。依赖范围
1、compile
默认的范围,compile依赖范围的artifacts在项目的所有classpath(compile, runtime, test)中都可以引用到,而且会传递给依赖的项目。
2、provided
更像compile,但是依赖的artifacts在JDK或容器中已经存在,发布时项目的classpath(runtime)中不会带上provided范围的artifacts。
3、runtime
编译项目是不需要此依赖artifacts,但是项目运行时(runtime, test)需要此依赖artifacts。
4、test
正常项目编译和运行不需要此依赖artifacts,只有编译和运行测试代码时才需要。
5、system
与provided类似,但是你必须明确提供此依赖artifacts,而且此依赖artifacts存于本地而不是maven仓库里。
6、import(2.0.9以后支持)
这个范围只用于<dependencyManagement>部分的pom类型的artifacts,它表示artifacts应该用他的POM的<dependencyManangement>中依赖artifacts的替换它。因为是替换,所以import范围的依赖不参与依赖仲裁中路径深度的计算。
- 排除依赖(exclusion)
- 可选依赖(optional)
如果项目Y -> Z (可选),X -> Y则X只引入依赖Y,而不会引入依赖Z。“可选依赖”可以看做是“默认排除依赖”。