深入理解maven及应用.docx
《深入理解maven及应用.docx》由会员分享,可在线阅读,更多相关《深入理解maven及应用.docx(12页珍藏版)》请在冰豆网上搜索。
深入理解maven及应用
1、三套生命周期
对于maven的生命周期来说,共有三个相互独立的生命周期,分别是clean、default、site。
clean生命周期目的是清理项目,default生命周期目的是构建项目,而site生命周期目的是建立项目站点。
每个生命周期分别包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。
如clean生命周期包含pre-clean、clean和post-clean三个阶段,如果执行clean阶段,则会先执行pre-clean阶段。
较之于生命周期阶段有前后依赖关系,三套生命周期本身是相互独立的,用户可以仅调用clean生命周期的某个阶段,也可以不执行clean周期,而直接执行default生命周期的某几个阶段。
2、clean生命周期
clean生命周期包含三个阶段,主要负责清理项目,如下:
pre-clean
executesprocessesneededpriortotheactualprojectcleaning
clean
removeallfilesgeneratedbythepreviousbuild
post-clean
executesprocessesneededtofinalizetheprojectcleaning
3、default生命周期
default生命周期定义了真正构建时所需要执行的所有步骤,包含的阶段如下:
validate
validatetheprojectiscorrectandallnecessaryinformationisavailable.
initialize
initializebuildstate,e.g.setpropertiesorcreatedirectories.
generate-sources
generateanysourcecodeforinclusionincompilation.
process-sources
processthesourcecode,forexampletofilteranyvalues.
generate-resources
generateresourcesforinclusioninthepackage.
process-resources
copyandprocesstheresourcesintothedestinationdirectory,readyforpackaging.
compile
compilethesourcecodeoftheproject.
process-classes
post-processthegeneratedfilesfromcompilation,forexampletodobytecodeenhancementonJavaclasses.
generate-test-sources
generateanytestsourcecodeforinclusionincompilation.
process-test-sources
processthetestsourcecode,forexampletofilteranyvalues.
generate-test-resources
createresourcesfortesting.
process-test-resources
copyandprocesstheresourcesintothetestdestinationdirectory.
test-compile
compilethetestsourcecodeintothetestdestinationdirectory
process-test-classes
post-processthegeneratedfilesfromtestcompilation,forexampletodobytecodeenhancementonJavaclasses.ForMaven2.0.5andabove.
test
runtestsusingasuitableunittestingframework.Thesetestsshouldnotrequirethecodebepackagedordeployed.
prepare-package
performanyoperationsnecessarytoprepareapackagebeforetheactualpackaging.Thisoftenresultsinanunpacked,processedversionofthepackage.(Maven2.1andabove)
package
takethecompiledcodeandpackageitinitsdistributableformat,suchasaJAR.
pre-integration-test
performactionsrequiredbeforeintegrationtestsareexecuted.Thismayinvolvethingssuchassettinguptherequiredenvironment.
integration-test
processanddeploythepackageifnecessaryintoanenvironmentwhereintegrationtestscanberun.
post-integration-test
performactionsrequiredafterintegrationtestshavebeenexecuted.Thismayincludingcleaninguptheenvironment.
verify
runanycheckstoverifythepackageisvalidandmeetsqualitycriteria.
install
installthepackageintothelocalrepository,foruseasadependencyinotherprojectslocally.
deploy
doneinanintegrationorreleaseenvironment,copiesthefinalpackagetotheremoterepositoryforsharingwithotherdevelopersandprojects.
4、site生命周期
siet生命周期的目的是建立和发布项目站点,maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息,包含的阶段如下:
pre-site
executesprocessesneededpriortotheactualprojectsitegeneration
site
generatestheproject'ssitedocumentation
post-site
executesprocessesneededtofinalizethesitegeneration,andtoprepareforsitedeployment
site-deploy
deploysthegeneratedsitedocumentationtothespecifiedwebserver
5、命令行与生命周期
从命令行执行maven任务的最主要方式就是调用maven的生命周期阶段。
需要注意的是,各个生命周期是相互独立的,而一个生命周期的阶段是有前后依赖关系的。
例子如下:
1、$mvnclean:
该命令调用clean生命周期的clean阶段。
实际执行的阶段为clean生命周期的pre-clean和clean阶段。
2、$mvntest:
该命令调用default生命周期的test阶段。
实际调用的是default生命周期的validate、initialize等,直到test的所有阶段。
3、$mvncleaninstall:
该命令调换用clean生命周期的clean阶段和default生命周期的instal阶段。
6、插件目标
maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的形式存在。
对于插件本身,为了能够复用代码,它往往能够完成多个任务。
如maven-dependency-plugin有十多个目标,每个目标对应了一个功能,如dependency:
analyze、dependency:
tree和dependency:
list。
这是一种通用的写法,冒号前面是插件前缀,后面是该插件的目标。
7、插件绑定
maven的生命周期与插件相互绑定,用以完成实际的构建任务。
具体而言,是生命周期的阶段与插件的目标相互绑定,已完成某个具体的构建任务。
例如项目编译这一任务,它对应了default生命周期的compile阶段,而maven-compiler-plugin这一插件的compile目标能够完成该任务,因此将他们绑定。
7.1内置绑定
maven在核心为一些主要的生命周期接到绑定了很多插件的目标,如下:
clean和site生命周期相对简单。
clean
clean:
clean
site
site:
site
site-deploy
site:
deploy
default生命周期与插件目标的绑定关系有点复杂一些。
这是因为对于任何项目来说,例如jar项目和war项目,他们的项目清理和站点生成任务是一样的,不过构建过程会有区别。
例如jar项目需要打成jar包,而war项目需要打成war包。
由于项目的打包类型会影响构建的具体过程,因此,default生命周期的阶段与插件目标的绑定关系有项目打包类型所决定的,打包类型是通过pom中的packaging元素定义的。
最常见的打包类型是jar,它也是默认的打包类型。
基于该打包类型,default生命周期的内置绑定关系如下:
process-resources
resources:
resources
compile
compiler:
compile
process-test-resources
resources:
testResources
test-compile
compiler:
testCompile
test
surefire:
test
package
ejb:
ejb or ejb3:
ejb3 or jar:
jar or par:
par or rar:
rar or war:
war
install
install:
install
deploy
deploy:
deploy
7、2自定义绑定
除了内置绑定以为,用户还能够自己选择奖某个插件目标绑定到生命周期的某个阶段以执行更多更特色的任务。
[html] viewplaincopyprint?
1.
-- 自动复制资源文件件到根目录 -->
2.
3. org.apache.maven.plugins
4. maven-resources-plugin
5. 2.6
6.
7. true
8. GBK
9.
10. exe
11. zip
12. vbs
13. sh
14.
15.
16.
17.
18. copy-resources
19. validate
20.
21. copy-resources
22.
23.
24. true
25. ${project.build.directory}
26.
27. agentmanager.jsmooth
28. assembly.xml
29.
30.
31.
32. src/main/resources/
33. true
34.
35.
36.
37.
38.
39.
如上图定义了一个id为copy-resources的任务,绑定到default生命周期的validate阶段,绑定的插件为maven-resources-plugin,插件目标为copy-resources。
即用插件的copy-resources功能来实现项目资源文件的拷贝。
[html] viewplaincopyprint?
1.
-- 自动复制maven依赖包到lib目录 -->
2.
3. org.apache.maven.plugins
4. maven-dependency-plugin
5. 2.1
6.
7.
8. copy
9. install
10.
11. copy-dependencies
12.
13.
14. lib
15.
16.
17.
18.
同上,定义了一个id为copy的任务,利用插件maven-dependency-plugin的copy-dependencies目标绑定到default生命周期的install阶段,来实现项目依赖的jar包的自动复制。
当插件目标被绑定到不同的生命周期阶段时候,其执行顺序会有生命周期阶段的先后顺序决定的。
如果多个目标被绑定到同一个阶段,他们的执行顺序是由插件声明的先后顺序决定目标的执行顺序。
8、插件配置
用户可以配置插件目标的参数,进一步调整插件目标所执行的任务。
8、1命令行插件配置
如$mvninstall-Dmaven.test.skip=true的意义即跳过测试步骤。
参数-D的java自带的,其功能是通过命令行设置一个java系统属性,maven简单地重用了该参数以实现插件参数的配置。
8、2pom中插件全局配置
如项目编译使用1.6版本的源文件,生成与JVM1.6兼容的字节码文件,如下:
[html] viewplaincopyprint?
1.
2. org.apache.maven.plugins
3. maven-compiler-plugin
4. 2.3.2
5.
6.
7. 1.6
8.
9.
9、获取插件描述信息
$mvnhelp:
describe-Dplugin=org.apache.maven.plugins:
maven-compiler-plugin:
2.1 来获取插件的详细信息
可以简化为:
$mvnhelp:
describe-Dplugin=compiler
如果仅仅描述插件目标的信息,可以加上goal参数:
$mvnhelp:
describe-Dplugin=compiler-Dgoal=compile
如果想输出更详细的信息,可以加上detail参数:
$mvnhelp:
describe-Dplugin=compiler-Ddetail
(二):
灵活的构建
原文地址:
参考官方url:
http:
//maven.apache.org/guides/index.html
一个优秀的构建系统必须足够灵活,应该能够让项目在不同的环境下都能成功构建。
maven为了支持构建的灵活性,内置了三大特性,即:
属性、profile和资源过滤。
1、maven属性
maven属性分6类:
1、内置属性:
如${basedir}表示项目根目录,${version}表示项目版本
2、POM属性:
用户可以引用pom文件中对应的值。
如:
${basedir}项目根目录
${project.build.directory}构建目录,缺省为target
${project.build.outputDirectory}构建过程输出目录,缺省为target/classes
${project.build.finalNam