插件
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-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>
插件配置
使用命令行配置
在 maven 命令中加入 -D 参数,并伴随一个参数键=参数值的形式,来配置插件目标参数。
如:maven-surefire-plugin 插件提供一个 maven.test.skip 参数,当值为 true 时会跳过执行测试:
-- 对比 mvn install mvn install –Dmaven.test.skip=true
使用 pom 全局配置
在声明插件的时候,对插件进行一个全局配置,后面所有使用该插件的都要遵循这个配置。比如指定 maven-compile-plugin 编译 1.7 版本的源文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <fork>true</fork> <source>1.7</source> <target>1.7</target> </configuration> </plugin>
聚合与继承
聚合
:为了一次构建多个项目模块,就需要对多个项目模块进行聚合
<modules> <module>模块一</module> <module>模块二</module> <module>模块三</module> </modules>
继承:为了消除重复,把很多相同的配置提取出来,例如:dependency、grouptId,version 等
<parent> <groupId>com.xxxx.maven</groupId> <artifactId>parent-project</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../ParentProject/pom.xml</relativePath> </parent>
以下的元素是可以被继承的:
groupId,项目组ID;
version,项目版本;
description,项目描述信息;
organazation,项目的组织信息;
inceptionYear,项目的创始年份;
developers,项目开发者信息;
contributors,项目的贡献者信息;
distributionManagement,项目的部署信息;
issueManagement,项目的缺陷跟踪系统信息;
ciManagement,项目的持续集成系统信息;
scm,项目的版本控制系统信息;
mailingLists,项目的邮件列表信息;
properties,自定义的Maven属性;
dependencies,项目的依赖配置;
dependencyManagement,项目的依赖管理配置;
repositories,项目的仓库配置;
build,包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
reporting,包括项目的报告输出目录配置、报告插件配置。
注意下面的元素,这些都是不能被继承的:
artifactId
name
prerequisites
聚合与继承之间的关系
两者共同点为,打方式必须都是 pom
在实际的项目中,一个 pom 既是聚合 pom 又是父 pom
注:父 pom 中使用 dependencies 引入的依赖也会被子 pom 继承,所以不要将过多的实际依赖放在父 pom,父 pom 只用于管理,使用 dependencyManagement 标签。
灵活构建
使用属性、 resources 插件资源过滤功能(filter)和 Maven 的 profile 功能,实现环境的灵活切换