Maven 的核心仅仅定义了抽象的生命周期, 具体的任务是交给插件去完成的, 插件以独立构件形式存在, 因此, Maven 只会在使用时才会连接远程仓库下载需要使用的插件.
Maven为了复用代码, 一个插件能完成多个任务. 一些功能组成 Maven 插件, 每个 Maven 插件的功能是插件的目标.
插件绑定
生命周期的阶段与插件的目标相互绑定, 以完成某个具体的构建任务. eg: maven-compiler-plugin 对应 default 生命周期的 compile 阶段.
- clean
| 生命周期阶段 | 插件目标 |
|---|---|
| pre-clean | |
| clean | maven-clean-plugin:clean |
| post-clean |
- default
| 生命周期阶段 | 插件目标 |
|---|---|
| process-resources | maven-resources-plugin:resources |
| compile | maven-compiler-plugin:compile |
| process-test-resources | maven-resources-plugin:testResources |
| test-compile | maven-compiler-plugin:testCompile |
| test | maven-surefire-plugin:test |
| package | maven-jar-plugin:jar |
| install | maven-install-plugin:install |
| deploy | maven-deploy-plugin:deploy |
default 生命周期还有其他阶段, 默认它们没有绑定任何插件
- site
| 生命周期阶段 | 插件目标 |
|---|---|
| pre-site | |
| site | maven-site-plugin:site |
| post-site | |
| site-deploy | maven-site-plugin:deploy |
除了内置绑定, 可以通过自己选择某个插件目标绑定到某个生命周期的某个阶段.
自定义绑定
eg: 生成项目的源码 jar 包, 可以利用 maven-source-plugin, 它其中的 jar-no-fork 目标可以将项目主代码打包成 jar 文件, 可以将 default 生命周期 verify 阶段, 在完成集成测试后和安装构件之前创建源码 jar 包.
|
|
插件配置
命令行插件配置
Maven中可以使用 -D 参数, 并伴随一个参数建 = 参数值
eg: 编译时跳过项目里的测试代表1mvn install -Dmaven.test.skip=truePOM中插件全局配置
如果一些参数从项目创建到项目发布都不会改变或者很少改变, 可以在POM中全局配置.
eg: 生成支持Java 1.5 的字节码文件12345678910111213<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.1</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin></plugins></build>POM中插件任务配置
还可以为某个插件任务配置特定的参数, 比如上面生成项目源码的例子.
插件解析机制
插件仓库
1234567891011121314<pluginRepositories><pluginRepository><id>central</id><name>Maven Plugin Repository</name><url>http://repo1.maven.org/maven2</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots><releases><updatePolicy>never</updatePolicy></releases></pluginRepository></pluginRepositories>插件的默认groupId
POM配置插件时, 如果该插件是 Maven 的官方插件, 可以省略 groupId 的配置. Maven 解析插件时, 如果是 Maven 官方插件会默认获取超级 POM 中设置的版本, 如果是自定义插件, Maven 会先检查所有仓库中可用的版本, Maven3 会直接提取 release进行使用(Maven2 中默认使用 latest 进行解析).