版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
前言
《Maven实战》是本好书,工作这么久了,maven的很多东西天天见,却不知道为什么这么用,这本书可以解答你的疑惑。
生命周期和插件
生命周期和阶段
Maven拥有三套生命周期:clean、default和site。
每一个生命周期拥有多个阶段(phase
),每个阶段用来执行特定的操作。
- clean
阶段:pre-clean、clean、post-clean - default
阶段:validate、initialize、generate-sources、process-sources(处理资源文件)、generate-resources、process-resources、compile(编译源码)、process-classes、generate-test-sources、process-test-sources、generate-test-resources、process-test-resources、test-compile、process-test-classes、test(测试代码)、prepare-package、package(打包成jar/war)、pre-integration-test、integration-test、post-integration-test、verify、install(安装到本地仓库)、deploy(部署到远程仓库) - site
pre-site(生成站点的准备工作)、site(生成站点文档)、post-site(生成站点的结束工作)、site-deploy(站点部署到服务器)
阶段是顺序执行的,而且当前阶段的执行依赖于前面阶段的完成,比如我们执行mvn clean,实际上执行了pre-clean和clean两个阶段。
举个耳熟能详的例子:mvn clean install这个命令怎么理解?
这个命令执行clean生命周期的pre-clean、clean阶段和default生命周期的validate到install阶段。
插件和目标
maven的每一个插件对应多个目标(goal
),每个目标完成一个操作,比如maven-dependency-plugin的常见目标有analyze、tree、list,命令的写法为dependency:analyze、dependency:tree、dependency:list。
生命周期和插件的关系
插件的一些目标和生命周期的阶段是绑定的,通过执行插件的目标,我们可以调用生命周期某些阶段。
谈谈依赖范围
maven有六种依赖范围:compile、test、provided、runtime、system、import
- compile:默认。编译/测试/运行引入
- test:测试引入
- provided:编译/测试引入。比如servlet-api.jar是provided范围的,因为运行时tomcat等容器会提供该依赖,如果不是依赖范围,可能会出现问题。参照鄙人以前的采坑记录Xxx is not a Servlet
- runtime:测试/运行引入。比如mysql驱动包
- system:指定依赖包。不建议使用,因为引入的是非maven仓库的依赖,不利于maven管理。用法
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
- import:只有在dependencyManagement下才有效。
先说说dependencyManagement: 这玩意通常在父pom文件下定义,用来统一管理依赖的版本、范围等,子模块通过<parent>
指定父pom,如果需要引入父模块依赖管理中定义的依赖,就可以无需提供版本、依赖范围,当然,也可以提供,只不过会覆盖。注意:依赖管理虽然类似于面向对象的继承,但是这种继承并不是完全的,子模块如果未定义父模块依赖管理中的依赖,那么这些依赖就不会被子模块引入。
那么import有什么用呢?import的作用是引入其他pom文件中的依赖管理,比如,在创建springboot项目中,在父pom文件中经常看到import的使用。
<dependencyManagement>
<dependencies>
<!-- SpringBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>