讲解Maven的生命周期和插件,以及常用的命令。
Maven生命周期
三套生命周期
Maven 的生命周期并不是一个整体,Maven 拥有三套相互独立的生命周期:
- clean:项目清理的处理
- default(或 build):项目部署的处理
- site:项目站点文档创建的处理
三套生命周期本身是相互独立的,用户可以仅调用 clean 生命周期的某个阶段,或者仅仅调用 default 生命周期的某个阶段,而不会对其他生命周期产生任何影响。例如,当用户调用 clean 生命周期的 clean 阶段的时候,不会触发 default 生命周期的任何阶段,反之亦然。
注:所以一般的打包命令都是 clean package xxxxx,先 clean 再 package,就是因为 clean 和 package 是在两个不同的生命周期里面。
clean生命周期
当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
当调用 pre-clean 时,只有 pre-clean 阶段得以执行;当调用 clean 的时候,pre-clean和clean阶段会得以顺序执行,以此类推。这是因为每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。
default生命周期
重点步骤如下表,这个需要掌握:
default的23个阶段,仅了解即可:
在开发环境中,使用下面的命令去构建、安装工程到本地仓库:
mvn install
这个命令在执行 install 阶段前,按顺序执行了 default 生命周期的阶段 (validate,compile,package,等等),我们只需要调用最后一个阶段,如这里是 install。
site生命周期
- pre-site 执行一些在生成项目站点之前需要完成的工作。
- site 生成项目站点文档。
- post-site 执行一些在生成项目站点之后需要完成的工作。
- site-deploy 将生成的项目站点发布到服务器上。
这个没用过,后面如果需要用的话,我再试试。
Maven插件
插件介绍
Maven 三套生命周期定义各个阶段不做任何实际工作,实际工作都是由插件来完成的,每个生命周期阶段都是由插件的目标来完成。在 pom 文件中声明如下(打包源码文件插件):
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来:
- 创建 jar 文件
- 创建 war 文件
- 编译代码文件
- 代码单元测试
- 创建工程文档
- 创建工程报告
插件目标
一个插件有可能有多个功能、每个功能就是一个目标。比如 maven-dependency-plugin 有十多个目标,每个目标对应了一个功能。插件的目标为 dependency:analyze、dependency:tree和dependency:list。通用写法:冒号前面是插件前缀,冒号后面是插件的目标。比如 compiler:compile。
插件绑定
内置绑定
为实现快速构建,Maven 有一套内置的插件绑定。三套生命周期的插件绑定具体如下(其实是各个生命周期阶段与插件的目标的绑定)。其中 default 生命周期的构建方式会其打包类型有关、打包类型在POM中 packaging 指定。一般有 jar、war 两种类型。下面是默认绑定插件与生命周期关系图:
自定义绑定
自定义绑定允许我们自己掌控插件目标与生命周期的结合.以生成项目主代码的源码 jar 为例。使用到的插件和它的目标为:maven-source-plugin:jar-no-fork。将其绑定到 default 生命周期阶段 verify 上(可以任意指定三套生命周期的任意阶段)。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <!-- 指定作用在生命周期的哪个阶段 --> <goals> <goal>jar-no-fork</goal> <!-- 指定执行绑定插件的哪些目标 --> </goals> </execution> </executions> </plugin> </plugins> </build>
举个栗子
这个是项目中的示例:
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.0.1</version> <executions> <execution> <id>attach-sources</id> <phase>package</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <!-- 不执行单元测试 --> <skip>true</skip> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <encoding>${project.build.sourceEncoding}</encoding> <source>${java.version}</source> <target>${java.version}</target> <testSource>${java.version}</testSource> <testTarget>${java.version}</testTarget> </configuration> </plugin> </plugins>
maven-source-plugin是对Maven工程的源码进行打jar包的插件。
但是我试过,我将它去掉,一样可以打包成功,应该是用的Maven的默认插件。
maven-surefire-plugin是maven里执行测试用例的插件,示例我们是跳过了单元测试:
maven-compiler-plugin用于指定JDK的编译版本插件,在pom.xml的属性配置文件中,我们指定的是1.8。