一个完整的项目构建过程一般包括清理、编译、测试、打包、集成测试、验证、部署等步骤,Maven从中抽取了一套完善的、易扩展的生命周期。Maven的生命周期是抽象的,其中的具体任务都交由插件来完成。Maven为大多数构建任务编写并绑定了默认的插件,如针对编译的插件:maven-compiler-plugin。用户也可自行配置或编写插件。html
1 . 三套生命周期apache
Maven定义了三套生命周期:clean、default、site,每一个生命周期都包含了一些阶段(phase)。三套生命周期相互独立,但各个生命周期中的phase倒是有顺序的,且后面的phase依赖于前面的phase。执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase。app
1 . 1 clean生命周期maven
1 . 2 default生命周期ide
default生命周期是最核心的,它包含了构建项目时真正须要执行的全部步骤。post
1 . 3 site生命周期测试
2 . Maven的插件ui
Maven的核心文件很小,主要的任务都是由插件来完成。定位到:%本地仓库%\org\apache\maven\plugins,能够看到一些下载好的插件:url
Maven官网上有更详细的官方插件列表:spa
2 . 1 插件的目标(Plugin Goals)
一个插件一般能够完成多个任务,每个任务就叫作插件的一个目标。如执行mvn install命令时,调用的插件和执行的插件目标以下:
每一个插件都有哪些个目标,官方文档有更详细的说明:Maven Plugins
3 . 将插件绑定到生命周期
Maven的生命周期是抽象的,实际须要插件来完成任务,这一过程是经过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。如:将maven-compiler-plugin插件的compile目标绑定到default生命周期的compile阶段,完成项目的源代码编译:
3 . 1 内置的绑定
Maven对一些生命周期的阶段(phase)默认绑定了插件目标,由于不一样的项目有jar、war、pom等不一样的打包方式,所以对应的有不一样的绑定关系,其中针对default生命周期的jar包打包方式的绑定关系以下:
第二列中,冒号后面便是绑定的插件目标,冒号前面是插件的前缀(prefix),是配置和使用插件的一种简化方式。Plugin Prefix
3 . 2 自定义绑定
用户能够根据须要将任何插件目标绑定到任何生命周期的阶段,如:将maven-source-plugin的jar-no-fork目标绑定到default生命周期的package阶段,这样,之后在执行mvn package命令打包项目时,在package阶段以后会执行源代码打包,生成如:ehcache-core-2.5.0-sources.jar形式的源码包。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <id>attach-source</id> <phase>package</phase><!-- 要绑定到的生命周期的阶段 --> <goals> <goal>jar-no-fork</goal><!-- 要绑定的插件的目标 --> </goals> </execution> </executions> </plugin> </plugins> …… </build>
4 . 配置插件
Maven插件高度易扩展,能够方便的进行自定义配置。如:配置maven-compiler-plugin插件编译源代码的JDK版本为1.7:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin>
也能够对插件的各个目标进行更具体的配置。Configuring Plug-ins
5 . 插件仓库
跟其余构件同样,插件也是根据坐标存储在Maven仓库中。超级POM中Maven配置的默认插件远程仓库以下:
<pluginRepositories> <pluginRepository> <id>central</id> <name>Central Repository</name> <url>http://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginRepository> </pluginRepositories>
推荐博客:许晓斌 Juven Xu