深入理解maven及应用(一):生命周期和插件
来源:互联网 发布:优美句子知乎 编辑:程序博客网 时间:2024/04/30 20:45
在项目里用了快一年的maven了,最近突然发现maven项目在eclipse中build时非常慢,因为经常用clean install命令来build项目,也没有管那么多,但最近实在受不了乌龟一样的build速度,于是下定决心再看看《maven实战》吧,
对于我来说,maven最主要的作用有两个方面,一个是对jar包的依赖解决功能,自己管理jar包,另一个功能就是项目的构建,打包部署。现在我觉得最重要的还是maven的生命周期和插件机制,下面就来总结一下吧。
参考url:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
1、三套生命周期
对于maven的生命周期来说,共有三个相互独立的生命周期,分别是clean、default、site。clean生命周期目的是清理项目,default生命周期目的是构建项目,而site生命周期目的是建立项目站点。
每个生命周期分别包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。如clean生命周期包含pre-clean、clean和post-clean三个阶段,如果执行clean阶段,则会先执行pre-clean阶段。
较之于生命周期阶段有前后依赖关系,三套生命周期本身是相互独立的,用户可以仅调用clean生命周期的某个阶段,也可以不执行clean周期,而直接执行default生命周期的某几个阶段。
2、clean生命周期
clean生命周期包含三个阶段,主要负责清理项目,如下:
3、default生命周期
default生命周期定义了真正构建时所需要执行的所有步骤,包含的阶段如下:
4、site生命周期
siet生命周期的目的是建立和发布项目站点,maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息,包含的阶段如下:
pre-siteexecutes processes needed prior to the actual project site generationsitegenerates the project's site documentationpost-siteexecutes processes needed to finalize the site generation, and to prepare for site deploymentsite-deploydeploys the generated site documentation to the specified web server
5、命令行与生命周期
从命令行执行maven任务的最主要方式就是调用maven的生命周期阶段。需要注意的是,各个生命周期是相互独立的,而一个生命周期的阶段是有前后依赖关系的。例子如下:
1、$mvn clean :该命令调用clean生命周期的clean阶段。实际执行的阶段为clean生命周期的pre-clean和clean阶段。
2、$mvn test:该命令调用default生命周期的test阶段。实际调用的是default生命周期的validate、initialize等,直到test的所有阶段。
3、$mvn clean install:该命令调换用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生命周期相对简单。
default生命周期与插件目标的绑定关系有点复杂一些。这是因为对于任何项目来说,例如jar项目和war项目,他们的项目清理和站点生成任务是一样的,不过构建过程会有区别。例如jar项目需要打成jar包,而war项目需要打成war包。
由于项目的打包类型会影响构建的具体过程,因此,default生命周期的阶段与插件目标的绑定关系有项目打包类型所决定的,打包类型是通过pom中的packaging元素定义的。最常见的打包类型是jar,它也是默认的打包类型。基于该打包类型,default生命周期的内置绑定关系如下:
7、2自定义绑定
除了内置绑定以为,用户还能够自己选择奖某个插件目标绑定到生命周期的某个阶段以执行更多更特色的任务。
<!-- 自动复制资源文件件到根目录 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.6</version><configuration><includeEmptyDirs>true</includeEmptyDirs><encoding>GBK</encoding><nonFilteredFileExtensions><nonFilteredFileExtension>exe</nonFilteredFileExtension><nonFilteredFileExtension>zip</nonFilteredFileExtension><nonFilteredFileExtension>vbs</nonFilteredFileExtension><nonFilteredFileExtension>sh</nonFilteredFileExtension></nonFilteredFileExtensions></configuration><executions><execution><id>copy-resources</id><phase>validate</phase><goals><goal>copy-resources</goal></goals><configuration><includeEmptyDirs>true</includeEmptyDirs><outputDirectory>${project.build.directory}</outputDirectory><excludes><exclude>agentmanager.jsmooth</exclude><exclude>assembly.xml</exclude></excludes><resources><resource><directory>src/main/resources/</directory><filtering>true</filtering></resource></resources></configuration></execution></executions></plugin>
如上图定义了一个id为copy-resources的任务,绑定到default生命周期的validate阶段,绑定的插件为maven-resources-plugin,插件目标为copy-resources。即用插件的copy-resources功能来实现项目资源文件的拷贝。
<!-- 自动复制maven依赖包到lib目录 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>2.1</version><executions><execution><id>copy</id><phase>install</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>lib</outputDirectory></configuration></execution></executions></plugin>
同上,定义了一个id为copy的任务,利用插件maven-dependency-plugin的copy-dependencies目标绑定到default生命周期的install阶段,来实现项目依赖的jar包的自动复制。
当插件目标被绑定到不同的生命周期阶段时候,其执行顺序会有生命周期阶段的先后顺序决定的。如果多个目标被绑定到同一个阶段,他们的执行顺序是由插件声明的先后顺序决定目标的执行顺序。
8、插件配置
用户可以配置插件目标的参数,进一步调整插件目标所执行的任务。
8、1命令行插件配置
如 $mvn install -Dmaven.test.skip=true 的意义即跳过测试步骤。
参数-D的java自带的,其功能是通过命令行设置一个java系统属性,maven简单地重用了该参数以实现插件参数的配置。
8、2pom中插件全局配置
如项目编译使用1.6版本的源文件,生成与JVM1.6兼容的字节码文件,如下:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin>
9、获取插件描述信息
$mvn help:describe-Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1 来获取插件的详细信息
可以简化为:
$mvn help:describe-Dplugin=compiler
如果仅仅描述插件目标的信息,可以加上goal参数:
$mvn help:describe-Dplugin=compiler-Dgoal=compile
如果想输出更详细的信息,可以加上detail参数:
$mvn help:describe-Dplugin=compiler-Ddetail
- 深入理解maven及应用(一):生命周期和插件
- 深入理解maven及应用(一):生命周期和插件
- Maven学习总结(16)——深入理解maven生命周期和插件
- Maven学习总结(16)——深入理解maven生命周期和插件
- Maven学习总结(12)——深入理解maven生命周期和插件
- 深入理解maven及应用
- 深入理解maven及应用
- 深入理解maven及应用
- 深入理解maven及应用
- 深入理解maven及应用
- 深入理解PHP内核(一):生命周期和zend引擎
- 深入理解maven及应用--转
- 深入理解maven及应用--转
- 深入理解maven及应用--转
- Maven:生命周期及插件
- maven深入理解(一)
- maven 生命周期及插件(六)
- Maven-生命周期和插件
- Solr学习总结-查询
- Linux操作系统内核编译详解
- Android中的Handler的具体用法
- ajax之分页
- 客户端以post方式调用Wcf
- 深入理解maven及应用(一):生命周期和插件
- apk插件化摸索…
- Linux中软件包常见格式的安装与卸载
- CentOS 搭建 Mysql MMM 高可用架构
- JavaScript高级编程阅读笔记
- 单台物理机搭建Sequoiadb集群
- python实现 从一个数组中找到完全含有另一个数组元素的最短子数组
- 并行输入\输出控制器之我见(PIO)
- 基于中值滤波或双边滤波方式的图像去雾效果的研讨。