maven生命周期可以理解为项目构建时的各个步骤,并且这些步骤是有一定次序的。只是这些规定好的步骤没有具体的实现。这些步骤的具体实现是由插件完成的,所以,插件机制也是maven的一大特点。
那maven具体的生命周期有什么内容呢,先看下面的拓展图:
正如图所示,maven的有三套生命周期,分别为clean、default、sit三套生命周期,概述如下:
clean生命周期:用来清理项目
default生命周期:用来构建项目
sit生命周期:用来建立项目站点
这里,顺便说一下什么是生命周期的阶段phase、插件的目标target:
生命周期阶段phase:拿clean生命周期来说,它包括pre-clean、clean、post-clean,这些已经规定好顺序的具体步骤,称为生命周期的phase。
插件目标target:maven生命周期的具体实现,都是绑定各种插件来实现的,而对于每插件来说,它的功能并不是只有一个,例如插件maven.resource.plugin,它有几个功能,对应的每个功能,称为插件目标。
每套生命周期的阶段phase如图中末节点所示,对应的每个阶段phase都可以绑定一个或多个插件的目标target。每套生命周期具体的每个阶段phase的执行,都是建立在前一个阶段phase的基础上的,例如clean生命周期,执行clean阶段时,pre-clean阶段一定是在这之前已经执行了的。
maven虽然规定了具体的生命周期及生命周期对应的阶段,但在构建maven项目的时候,默认不需要我们去一一指定构建时具体的阶段要对应哪个插件目标,maven默认在生命周期内置绑定插件的目标。
比如执行mvn clean install指令时,默认绑定的插件具体内容如下,冒号前对应插件前缀,冒号后对应插件的目标:
maven-clean-plugin:clean 清除上一次构建时生成的目标文件
maven-resources-plugin:resources 复制项目资源文件
maven-compiler-plugin:compiler 编译项目源代码
maven-resources:testResources 复制项目测试资源文件
maven-compiler:testCompiler 编译项目测试代码
maven-surefire-plugin:test 执行测试单元
maven-jar-plugin:jar 打成jar包
maven-install-plugin 将jar包发布到本地仓库
从插件的目标,我们也可以看到对应的执行阶段,具体的如下:clean生命周期的pre-clean 、clean 、post-clean,default生命周期的validate至install所有阶段。
如下,在pom.xml配置文件中自定义配置,如下,指定插件在对应的生命周期阶段生成项目源码包
org.apache.maven.plugins
maven-source-plugin
3.0.1
attach-source
verify
jar-no-fork
附:很多时候,我们不知道插件的功能目标是什么,可以通过如下命令查看插件的详细信息,例如所包含的目标,及目标的说明或插件的参数:
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail
help:全名为maven-help-plugin,也是maven的一个插件
describe:插件的目标
-Dplugin:maven的参数标识,后面的内容指定参数为插件的坐标
-Ddetail:maven的参数标识,指输出具体的信息。
1、与之密切关联的三种classpath:编译classpath、测试classpath、运行classpath
2、几种依赖范围
compiler 编译依赖范围,默认使用范围,对三种classpath都有效
test 测试依赖范围,只对测试classpath有效,在编译或运行时无法使用此依赖
provided 已提供依赖范围,在编译和测试时有效,运行时无效
runtime 运行时依赖范围,测试和运行classpath有效,编译主代码时无效
system 系统依赖范围,与provided一样,但可以使用system依赖范围时,必须用systemPath指定依赖文件路径
import 导入依赖范围,该范围不会对三种classpath产生影响
maven依赖的传递原则:
1、传递路径短的优先
2、传递路径一样,则先声明者优先
可选依赖:
不会受依赖传递性影响,如果引用可选类型的依赖,需要显示声明
排除依赖
归类依赖:
<自定义标签>content自定义标签>
pom.xml配置依赖远程仓库:
true/false
true/false
default
setting.xml配置仓库认证信息(必须配置在setting.xml文件中):
这里id必须与pom中需要认证的repository元素的一致,才能将认证信息与仓库配置联系在一起。
pom.xml配置部署远程仓库:
附:repository:表示发布版本构造的仓库。snapshotRepository:表示快照版本发布的仓库
配置完后,执行发布的命令:mvn clean deploy
Apache插件网址:
http://maven.apache.org/plugins/index.html
pom.xml文件中配置插件远程仓库:
false/true
never
将两个或多个项目模块聚合到一个项目下,一般情况下,会创建一个聚合模块,该模块与其它被聚合的模块是父子关系(其实也可以是平级关系,如果是平级的话,module的路径则要相应的调整),步骤如下:
1、创建一个文件夹,并命名(此名字一般为等下要创建的POM文件的artifactId一致),做为聚合模块的项目目录,
然后把要被聚合的模块放到该文件夹下,并在文件夹下新建一个pom.xml文件,其配置如下:
4.0.0
framework.organizemanager
organizemanager
1.0.0-SANPSHOT
pom
framework organizemanager
organizemanager-dao
organizemanager-service
groupId:和要被聚合的模块的groupId一样
artifactId:做为聚合项目的项目名,与模块名必须不一样
version:可与其它模块一样
packaging:这前创建的maven项目,打包方式多数是jar、war,而做为聚合模块的项目,这里要用pom
name:可选
modules:要聚合所有项目模块的总标签
module:具体要聚合的项目模块标签,标签内所填内容,即为所聚合的模块的项目目录名,一般项目目录名与模块的artifactId一致
2、在聚合模块(即刚新建的文件夹)的根目录下执行mvn clean install
一个maven项目,会有多个maven模块,因此,每个模块,也会对应一个pom,每个pom引用的依赖包或使用的插件,都可能会有重复性的操作,通过继承,能更好的减少配置的冗余,提高项目的依赖管理集中性,也能让不同模块,在同一项目中尽量保持同版本的依赖包。
父级pom:
子模块pom:
relatevePath:默认路径是 ../pom.xml
反应堆:
对于聚合模块来说的,对聚合的模块的一个执行顺序,它会根据各个模块的pom文件,先执行pom里面的引用模块,再执行本身模块。
反应堆裁剪:
-pl :构建指定的模块 mvn clean install -pl organizemanager-dao
-am :构建模块的依赖模块 mvn clean install -pl organizemanager-dao -am
-adm :同时构建依赖于指定模块的模块 mvn clean install -pl organizemanager amd
-rf :从指定的模块回复反应堆,即从反应堆构建顺序的基础上指定从哪个模块开始构建 mvn clean install -pl organizemanager -amd -rf organizemanager-service
测试插件:maven-surefire-plugin
如何跳过测试的几种方式如下:
1、命令模式:mvn package -DskipTest
2、Pom配置模式:
org.apache.maven.plugins
maven-compiler-plugin
2.5
true
3、跳过测试代码的编译:mvn package -Dmaven.test.skip = true
附:参数maven.test.skip同时控制了maven-compiler-plugin和maven-surefire-plugin
如何执行单元测试 :
1、指定测试单元执行测试:
mvn test -Dtest = HelloWorldTest
2、模糊匹配指定
mvn test -Dtest = Hello*Test
3、 指定多个测试单元执行测试
mvn test -Dtest = HelloWorldTest,SecurityTest
如果执行mvn test -Dtest命令时,没有找到任何测试单元,则会报错,如要不报错,可加-DfailIfNoTests=false,完整示例如下:
mvn test -Dtest -DfailIfNoTests=false
该功能主要能过maven-resources-plugin插件来实现,具全如下配置:
1、在build标签下标置于需要过滤的资源文件夹路径,并设置filtring标签内容为true,用来指定哪里的资源内容(如/resource/db.properties文件里的内容)需要被pom文件里的profile标签内容替换。
${project.basedir}/src/main/resources
true
${project.basedir}/src/test/resources
true
2、在project标签下配置profile标签,profile中属性properties下的子标签命名和资源文件中待替换标识符一致,
而properties下子标签的内容,即是要替换到资源文件中的最终内容,如下:
dev
com.mysql.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/platform
root
dev-pwd
test
com.mysql.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/platform
root
dev-pwd
3、执行maven指令,mvn clean install -Pdev
-P:是用来启动profile文件过滤的,而dev,是指定使用profiles下id为dev的profile集合配置
如果有多个profile配置,可提定maven激活具体某个profile,指定的方式有几种,如下:
1、命令行激活
mvn clean install -Pdev,-Ptest
2、settings文件显示激活,让配置的profile对于所有项目都处于激活状态
3、系统属性激活,当系统某个属性存在时,则自动激活profile
4、文件是否存在激活
5、用户默认激活
列出项目中例用的avtive
mvn help:active-profiles
mvn help:all-profiles
maven过滤web资源
1、配置profile
client-a
a.jpg
red
2、配置插件maven-war-plugin
org.apache.maven.plugins
maven-war-plugin
2.1-beta-1
true
src/main/webapp
<**/*.css/include>
<**/*.js/include>
3、执行maven命令,mvn clean install -Pclient-a