Maven 通过生命周期和配置插件构建项目
一、【生命周期】和【阶段】的概念
Maven 是基于插件的项目,这与其基于阶段的构建过程是分不开的。
Maven 的每一个构建阶段,都有对应绑定的插件。
注意:
构建阶段和插件是相互独立的。
构建阶段的默认执行插件及目标是通过 packaging 的类型指定的。
packaging 的类型中定义了一系列的阶段,及每个阶段要执行哪个插件的哪个目标。
Maven 把构建项目的过程,总体分为三个生命周期(lifecycle):
1、默认构建:default
2、项目清理:clean
3、项目建站:site
每个生命周期又由许多阶段(phase)组成。
而每个阶段,都可以指定默认执行的目标(goal),去具体执行某项工作。
举例说明:
1、默认构建:default,分为以下阶段:
1)validate
2)compile
3)test
4)package
5)verify
6)install
7)deploy
这些阶段是有顺序的,构建时按序逐一执行。
在命令行中使用阶段来执行构建。只需输入阶段名称即可。
Maven会按顺序执行该阶段之前的所有阶段。
例如:
mvn install
mvn clean package
查看三大生命周期中的阶段:
http://maven.apache.org/ref/3.5.0/maven-core/lifecycles.html
2、阶段被绑定了默认的执行插件及目标
当指定了 packaging 的类型时,
我们可以直接调用阶段的名称来执行 Maven 构建。
因为阶段被默认绑定了一个(或多个) Maven 的核心插件。
然而,我们也可以用命令行调用某个插件的某个目标:
mvn clean dependency:copy-dependencies package
以上命令会执行 clean ,然后执行 dependency 插件的 copy-dependencies 目标(goal),
最后执行 package 阶段。
当然,
使用内置 packaging 类型时,构建的阶段都是绑定了一个或多个插件,
这些插件被称为【核心插件】。
参考:https://maven.apache.org/plugins/index.html
核心插件的命名规则为:maven-name-plugin
而自定义插件的命名规则为:name-maven-plugin
参考:https://maven.apache.org/guides/plugin/guide-java-plugin-development.html
如果你对 maven 提供的核心插件默认执行的 goal 不满意,
Maven 还允许对核心插件进行配置(通过 plugins标签)。
Maven 的核心插件分为两种:
类型一(Type:B):Build plugins
类型二(Type:R):Reporting plugins
参考:https://maven.apache.org/plugins/index.html
二、构建项目:给阶段绑定目标
上面说了,可以单独调用某个阶段名称绑定某个插件的某个goal,进行单个步骤的构建。
但是,Maven 的阶段是独立于 goal 的,生命周期中的阶段都没有绑定任何插件的任何 goal。
引用:http://maven.apache.org/ref/3.5.0/maven-core/lifecycles.html
如果要想一系列的调用阶段,并在每个阶段都绑定一些特定的 goal,该怎么做?
1、整体构建:使用内置的基本打包类型 packaging
Maven 提供了通过指定 packaging 的类型来指定生命周期中的某些阶段所执行特定插件的 goal。
内置的 packaging 的类型包括:jar,war,ear,pom
拿 jar 举例(jar 是 maven 默认的 packaging 类型,packaging 未指定时就是 jar 类型),
如果 packaging 类型是 jar,则其相应的 maven 各个阶段所对应的插件的默认执行的目标如下:
/* 阶段名称 该阶段所对应的插件及默认调用的目标 process-resources resources:resources compile compiler:compile process-test-resources resources:testResources test-compile compiler:testCompile test surefire:test package jar:jar install install:install deploy deploy:deploy */
这基本上就是标准的绑定了。但是,不同的 packaging 的类型所调用的阶段和插件也不一样。
例如 packaging 是 pom 的(表明该 project 是一个父类),
只绑定了 install 和 deploy 两个阶段。
另外,如果使用自定义的 packaging 类型,需要在 build 标签的 plugin 标签里加上
extension 值为 true
查看所有内置 packaging 类型在不同的构建阶段(phase)的默认绑定目标(goal):
http://maven.apache.org/ref/3.5.0/maven-core/default-bindings.html
2、配置 plugin 标签:将插件的 goal 绑定到项目构建的不同阶段中
第二种方法是在 plugins 标签中对每个插件进行配置。
前面已提到,Maven 是基于插件的,并且提供了可以对其核心插件进行配置的功能。
需要注意的是,只是在 build 中引用 plugin 的坐标是不够的,
还需要在 plugin 标签中的 execution 标签中配置在哪个阶段(phase)运行哪些目标(goal)。
新配置的 goal 会添加到阶段中,与阶段中原有的 goal 合并。
执行顺序是先执行原有的,再执行新配置的。
如果配置了多个 execution,它们的 goal 被绑定在相同的阶段,
goal 都会被按配置的顺序逐一执行。当然,还是阶段原有的goal先执行。
阶段原有的 goal 是在 packaging 中定义的。
举例:
拿 compiler 核心插件举例。该插件有两个目标:compile,testCompile
前者编译 main 目录下的源码
后者编译 test 目录下的源码
packaging 为 jar 时,它在 compile 阶段只绑定了 compiler 插件的 compile 目标。
即:compile 阶段不执行 testCompile 目标。
我们可以在 compile 阶段,把 testCompile 目标也添加进来:
说明:
这样做只是为了演示用途,
因为 testCompile 目标被 packaging 为 jar 时,绑定在了 test-compile 阶段上。
test org.apache.maven.plugins maven-compiler-plugin 3.6.1 1.7 compile testCompile
运行:
mvn clean compile
日志:
/* [INFO] --- maven-compiler-plugin:3.6.1:compile (default-compile) @ test --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 6 source files to /Users/Eddy/Documents/workspace/Test002-JavaEE/target/classes [INFO] [INFO] --- maven-compiler-plugin:3.6.1:testCompile (default) @ test --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/Eddy/Documents/workspace/Test002-JavaEE/target/test-classes */
从执行日志中可以看出,Maven 先执行了 compile 阶段原有的目标:compile,
而后执行了在 plugins 中新配置的且绑定在 compile 阶段的目标:testCompile
注意:
如果在 plugins 中配置的绑定在 compile 阶段的目标也为 compile 的话,
compile 目标会执行两边!
第二篇:Maven构建项目之 build 标签
http://lixh1986.iteye.com/blog/2382352
第三篇:Maven构建项目之 build 标签中的 Plugin 配置
一、Maven 插件之基本配置:configuration 标签
Maven 的插件具体分为 Build 插件 和 Report 插件。
它们都有共同的 configuration 配置标签。
configuration 标签中的配置项,对应的是插件类中的属性或set方法。
举例:
1、插件的实现类:
/** * @goal query */ public class MyQueryMojo extends AbstractMojo { /** * @parameter expression="${query.url}" */ private String url; /** * @parameter default-value="60" */ private int timeout; /** * @parameter */ private String[] options; public void execute() throws MojoExecutionException { ... } }
2、对应的配置文件应该为:
... ... maven-myquery-plugin 1.0 http://www.foobar.com/query 10
二、Maven 插件之 Build 中插件的配置:executions 标签
executions 标签用来配置在 Maven 构建项目时的哪个生命周期的哪个阶段(phase),
执行什么目标(goal)。
如果 goal 有默认的 phase,则 goal 会在执行到那个 phase 时执行。
如果 goal 没有默认的 phase,而又没有手动指定一个,则该 goal 不会自动执行。
当然,每一个 execution 都可以有自己的一个 configuration。
... ... maven-myquery-plugin 1.0 execution1 test http://www.foo.com/query 10 query execution2 http://www.bar.com/query 15 query
execution 的 id 是干嘛用的?
如果在执行 maven 时,没有指定 execution 的 id,则会执行全部的 executions。
如果指定了,则只会执行指定的那个 execution。
三、dependencies 标签
Maven 是可以自动解决依赖包的下载的。
此处的 dependencies 标签主要用于指定使用某个特定版本的依赖。
比如指定使用最新版本的依赖包。
四、inherited 标签
Maven项目中的插件,默认是传递给子项目中起作用的。
可以使用 inherited 标签,将传递功能禁用。
-
转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2383960
引用:
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
https://maven.apache.org/guides/mini/guide-configuring-plugins.html
-