maven(7)生命周期和插件

【0】README
1)本文部分文字转自 “maven实战”,旨在 review  “maven(7)生命周期和插件” 的相关知识;
2)maven 另外两个核心概念是生命周期和插件:maven的生命周期是抽象的,其实际行为都由插件来完成,如package阶段的任何可能都会由 maven-jar-plugin 完成;

【1】何为生命周期
1)intro:maven 的 生命周期就是为了对所有的构建过程进行抽象和统一;
2)maven的生命周期: 生命周期本身不做任何实际的工作,都是交由 插件来完成。这种idea 和 模板方法非常相似;模板方法模式在父类中定义算法的整体结构,子类可以通过实现或重写父类方法来控制实际的行为,这样既保证了算法有足够的可扩展性,又能够严格控制算法的整体结构;(干货——review 模板方法模式)

3)problem+solutions:
3.1)problem:生命周期抽象了构建的 各个steps,定义了它们的次序,但没有提供具体实现。那么谁来实现这些step 呢?
3.2)solutions:maven 当然必须要考虑这一点,因此它设计插件机制。每个构建step 都可以绑定一个或者多个插件行为,而且maven 为大多数构建step 编写并绑定了 默认插件;

【2】生命周期详解
1)intro:要了解生命周期的具体定义和使用方式;

【2.1】三套生命周期
1)intro:maven 拥有3套相互独立的生命周期(lifecycle):分别是 clean,default, site。
lifecycle1)clean 生命周期: 的目的是清理项目
lifecycle2)default生命周期:的目的是构建项目
lifecycle3)site 生命周期: 的目的是建立项目站点;
Attention)
A1)每个生命周期包含一些阶段:以clean 生命周期为例,包含的 阶段有pre-clean, clean 和 post-clean;
A2)三套生命周期本身是相互独立的,用户可以仅仅调用clean生命周期的某个阶段,或者仅仅调用 default 生命周期短某个阶段,而不会对其他生命周期产生任何影响;

【2.2】clean 生命周期
1)intro:clean 生命周期包含3个阶段(stage)
stage1)pre-clean:清理前需要完成的工作;
stage2)clean:清理上一次构建生成的文件;
stage3)post-clean:清理后需要完成的工作;

【2.3】default 生命周期
1)intro:default 生命周期定义了 真正构建时所需要执行的所有steps,它是所有生命周期中最核心的部分,其包含的阶段如下(stages),只对重要的进行解释:



【2.4】site 生命周期
1)intro:site生命周期的目的是建立和发布项目站点,maven 能够基于POM 所包含的信息,自动生成一个友好的站点;
2)该生命周期包含如下的 stages:

【2.5】命令行与生命周期
1)intro:从命令行执行maven任务的最主要方式就是调用 maven 的生命周期阶段。需要注意的是,各个生命周期是相互独立的,而一个生命周期的阶段是有前后依赖关系的。
2)下面以常见的maven 命令为例,解释其执行的生命周期阶段:



【3】插件目标
1)intro:maven的核心仅仅定义了 抽象的生命周期,具体的任务是 交由插件完成的,插件以独立的构件形式存在,因此,maven 核心的分发包只有不到 3MB 大小,maven 会在需要的时候下载并使用插件;
2)对于插件: 为了能够复用代码,它往往能够完成多个任务;(干货——一个插件完成多个任务)
3)因为任务背后有很多可以复用的代码,即不同任务的实现代码有一部分是相同的,可以复用的,因此,多个功能聚集在一个插件里,每个功能就是一个插件目标;(干货——一个插件有多个功能,有多个目标,一个功能 == 一个目标)

4)看个荔枝: maven-dependency-plugin有多个目标
4.1)intro: maven-dependency-plugin有多个目标,每个目标对应一个功能,上述提到的几个功能分别对应的插件目标为 dependency:analyze, dependency:tree 和 dependency:list;
4.2)这是一种通用的写法: 冒号前面是 插件前缀,后面是该插件的目标;(干货——引入了插件前缀)

【4】插件绑定
1)intro:具体而言,是生命周期的阶段与 插件的目标相互绑定,以完成某个具体的构建任务;如下图所示:
【4.1】内置绑定
1)intro:为了让用户几乎不用任何配置就构建maven 项目,maven 在核心为一些主要的生命周期绑定了很多插件的目标;
2)clean 和 site 生命周期 阶段与插件目标的绑定关系如下图所示:

3)default 生命周期 阶段与插件目标的绑定关系如下图所示:

对上表的分析(Analysis)
A1)default 与插件目标的绑定关系是由 项目打包类型所决定的,打包类型是通过 POM 中的 packaging 元素定义的;
A2)除了默认的 jar 打包类型外,常见的打包类型还有 war,pom,maven-plugin,ear等;

4)看个荔枝: mvn clean install, maven 会输出包含了生命周期阶段与 插件的绑定关系
D:\classical_books\java_set\maven_in_action\mycode\chapter3>mvn clean install
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.maven.chapter3:service:jar:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 22, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building service says hello maven. 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ service ---
[INFO] Deleting D:\classical_books\java_set\maven_in_action\mycode\chapter3\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ service ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ service ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] Compiling 1 source file to D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ service ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ service ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] Compiling 1 source file to D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ service ---
[INFO] Surefire report directory: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\surefire-reports
-------------------------------------------------------T E S T S
-------------------------------------------------------
Running com.maven.chapter3.service.HelloTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.06 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ service ---
[INFO] Building jar: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-shade-plugin:1.2.1:shade (default) @ service ---
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar with D:\classical_books\java_set\maven_in
_action\mycode\chapter3\target\service-1.0-SNAPSHOT-shaded.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ service ---
[INFO] Installing D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar to D:\classical_books\java_set\maven_in_
action\local_repo\com\maven\chapter3\service\1.0-SNAPSHOT\service-1.0-SNAPSHOT.jar
[INFO] Installing D:\classical_books\java_set\maven_in_action\mycode\chapter3\pom.xml to D:\classical_books\java_set\maven_in_action\local_repo\com\ma
ven\chapter3\service\1.0-SNAPSHOT\service-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.305 s
[INFO] Finished at: 2016-06-22T18:43:41+08:00
[INFO] Final Memory: 17M/142M
[INFO] ------------------------------------------------------------------------


【4.2】自定义绑定
1)intro: 除了内置绑定外,用户可以自己选择将某个 目标绑定到 生命周期的某个阶段上;
2)看个荔枝:创建项目的源码jar 包,内置的插件绑定关系中并没有内置这一项任务,因此需要用户自行配置。 maven-source-plugin 可以帮助我们完成这项任务;它的 jar-no-fork 目标能够将项目的主代码打包成jar 文件,可以将其绑定到 default 生命周期的verify 阶段上;
<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>
对以上代码的分析(Analysis):
A1)executions 下每个execution 子元素可以用来配置执行一个任务;
A2)该例中配置了一个id 为 attach-sources 的 任务,通过 phrase 配置,将其绑定到 verify 生命周期阶段上,再通过 goal 配置指定要执行的插件 目标,至此,自定义插件配置完成了;(干货——总结了自定义插件配置的steps)

3)运行 mvn verify 看如下输出:
D:\classical_books\java_set\maven_in_action\mycode\chapter3>mvn verify
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.maven.chapter3:service:jar:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 22, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building service says hello maven. 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/2.1.1/maven-source-plugin-2.1.1.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/2.1.1/maven-source-plugin-2.1.1.pom (5 KB at 2.6 KB/sec)Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/14/maven-plugins-14.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/14/maven-plugins-14.pom (13 KB at 32.4 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/2.1.1/maven-source-plugin-2.1.1.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/2.1.1/maven-source-plugin-2.1.1.jar (24 KB at 59.4 KB/se
c)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ service ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ service ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ service ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ service ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ service ---
[INFO] Surefire report directory: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\surefire-reports-------------------------------------------------------T E S T S
-------------------------------------------------------
Running com.maven.chapter3.service.HelloTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.056 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ service ---
[INFO] Building jar: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-shade-plugin:1.2.1:shade (default) @ service ---
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar with D:\classical_books\java_set\maven_in
_action\mycode\chapter3\target\service-1.0-SNAPSHOT-shaded.jar
[INFO]
[INFO] --- maven-source-plugin:2.1.1:jar-no-fork (attach-sources) @ service ---  // maven-source-plugin:jar-no-fork 会得以执行.
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-archiver/2.4/maven-archiver-2.4.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-archiver/2.4/maven-archiver-2.4.pom (4 KB at 9.1 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-components/10/maven-shared-components-10.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-components/10/maven-shared-components-10.pom (9 KB at 19.0 KB/se
c)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact/2.0/maven-artifact-2.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact/2.0/maven-artifact-2.0.pom (723 B at 1.8 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven/2.0/maven-2.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven/2.0/maven-2.0.pom (9 KB at 21.5 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-model/2.0/maven-model-2.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-model/2.0/maven-model-2.0.pom (3 KB at 6.2 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-project/2.0/maven-project-2.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-project/2.0/maven-project-2.0.pom (2 KB at 4.1 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-profile/2.0/maven-profile-2.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-profile/2.0/maven-profile-2.0.pom (2 KB at 3.6 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact-manager/2.0/maven-artifact-manager-2.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact-manager/2.0/maven-artifact-manager-2.0.pom (2 KB at 3.6 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0.pom (2 KB at 3.1 KB/sec)Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-11/plexus-archiver-1.0-alpha-11.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-11/plexus-archiver-1.0-alpha-11.pom (2 KB at 4.5 KB/sec
)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-components/1.1.9/plexus-components-1.1.9.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-components/1.1.9/plexus-components-1.1.9.pom (3 KB at 6.3 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom (9 KB at 21.0 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-container-default/1.0-alpha-15/plexus-container-default-1.0-alpha-15.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-container-default/1.0-alpha-15/plexus-container-default-1.0-alpha-15.pom (
2 KB at 4.1 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.0-alpha-15/plexus-containers-1.0-alpha-15.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.0-alpha-15/plexus-containers-1.0-alpha-15.pom (2 KB at 4.9 KB
/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom (8 KB at 19.9 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-api/1.0-alpha-15/plexus-component-api-1.0-alpha-15.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-api/1.0-alpha-15/plexus-component-api-1.0-alpha-15.pom (948 B at2.4 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/1.2-alpha-6/plexus-classworlds-1.2-alpha-6.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/1.2-alpha-6/plexus-classworlds-1.2-alpha-6.pom (3 KB at 6.1 KB
/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.3/plexus-utils-1.3.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.3/plexus-utils-1.3.pom (2 KB at 2.6 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-3/plexus-io-1.0-alpha-3.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-3/plexus-io-1.0-alpha-3.pom (2 KB at 3.7 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom (3 KB at
5.7 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom (2 KB at 4.8 KB
/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom (3 KB at 6.1 KB
/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.4.9/plexus-utils-1.4.9.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.4.9/plexus-utils-1.4.9.pom (3 KB at 5.8 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.6/plexus-interpolation-1.6.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.6/plexus-interpolation-1.6.pom (3 KB at 7.1 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-9/plexus-archiver-1.0-alpha-9.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-9/plexus-archiver-1.0-alpha-9.pom (2 KB at 4.7 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-1/plexus-io-1.0-alpha-1.pom
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-1/plexus-io-1.0-alpha-1.pom (2 KB at 3.3 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-archiver/2.4/maven-archiver-2.4.jar
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.5.8/plexus-utils-1.5.8.jar
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-9/plexus-archiver-1.0-alpha-9.jar
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-1/plexus-io-1.0-alpha-1.jar
Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.6/plexus-interpolation-1.6.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-archiver/2.4/maven-archiver-2.4.jar (20 KB at 46.2 KB/sec)
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-1/plexus-io-1.0-alpha-1.jar (12 KB at 15.5 KB/sec)
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.6/plexus-interpolation-1.6.jar (50 KB at 43.3 KB/sec)
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-9/plexus-archiver-1.0-alpha-9.jar (154 KB at 116.1 KB/s
ec)
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.5.8/plexus-utils-1.5.8.jar (262 KB at 95.3 KB/sec)
[INFO] Building jar: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT-sources.jar // 生成了源码文件.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 18.822 s
[INFO] Finished at: 2016-06-22T19:00:32+08:00
[INFO] Final Memory: 13M/171M
[INFO] ------------------------------------------------------------------------

对以上console info的分析(Analysis):可以看到, 当执行 verify 生命周期阶段的时候,maven-source-plugin:jar-no-fork 会得以执行,它会创建一个以 -sources.jar 结尾的源码文件包;

4)problem+solutions:
4.1)problem:当插件目标被绑定到不同的生命周期的时候,其执行顺序会由生命周期阶段的先后顺序决定;当多个目标被绑定到同一阶段时,他们的执行顺序会是怎样?
4.2)solutions:当多个插件目标绑定到同一个阶段的时候,这些插件声明的先后顺序决定了目标的执行顺序;

【5】插件配置
1)intro:几乎所有maven 插件的目标都有一些可配置的参数,用户可以通过 命令行 和 POM 配置等方式来配置这些参数;

【5.1】 命令行插件配置
1)problem+solutions:
1.1)problem:如何从命令行配置插件?
1.2)solutions:用户可以在maven 命令中使用 -D 参数,并伴随一个参数键=参数值的形式,来配置插件目标的参数;参数-D 是java 自带的,其功能是通过命令行设置一个 java 系统属性;(干货——参数-D 是java 自带的,其功能是通过命令行设置一个 java 系统属性
2)看个荔枝: mvn install-Dmaven.test.skip=true : 跳过测试;

【5.2】POM 中插件全局配置
1)intro:在pom 文件中一次性配置显然要比在命令行中输入参数要方便;
2)用户可以在声明插件的时候,对此插件进行一个全局配置。也就是说,所有基于该插件目标的任务,都会使用这些配置;
3)看个荔枝:告诉maven 基于 jdk1.8 编译该文件.
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin>
【5.3】 POM中插件任务配置
1)intro:用户可以为某个插件任务配置特定的参数;
2)看个荔枝:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion>
<groupId>com.maven.chapter3</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
<name>service says hello maven.</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>1.2.1</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration> <transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.maven.chapter3.service.Hello</mainClass></transformer></transformers></configuration></execution></executions></plugin><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><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>1.3</version><executions><execution><id>ant-validate</id><phase>validate</phase><goals><goal>run</goal></goals><configuration><tasks><echo>i am bound to validate phase.</echo></tasks></configuration></execution><execution><id>ant-verify</id><phase>verify</phase><goals><goal>run</goal></goals><configuration><tasks><echo>i am bound to verify phase.</echo></tasks></configuration></execution></executions></plugin></plugins></build>
</project>
对以上代码的分析(Analysis):
A1)maven-antrun-plugin:run 与 validate 阶段绑定,从而构成了一个id为 ant-validate 的任务;
A2)插件 全局配置中的 configuration 元素位于 plugin 元素下面,而这里的configuration元素则位于 execution 元素下,表示这是 特定任务的配置,而非插件整体的配置;
A3)ant-validate任务配置了一个 echo 任务,而id为 ant-verify 任务也配置了一个 echo 任务;

【6】获取插件信息
1)intro:当遇到一个构件任务的时候,用户还需要知道到哪里去寻找合适的插件,以帮助完成任务;

【6.1】在线插件信息
1)intro:基本上所有的插件都来自 apache 和 codehaus;
2)插件详细的列表在这个地址得到:
http://maven.apache.org/plugins/index.html
http://repo1.maven.org/maven2/org/apache/maven/plugins/

3)看个荔枝:以 maven-surefire-plugin 为例,访问 https://maven.apache.org/surefire/maven-surefire-plugin/, 可以看到该插件的简要intro, 包含的目标,使用介绍;


Attention)并不是所有插件目标参数都有表达式,也就是说,一些插件目标参数只能在 POM 中配置;

【6.2】使用 maven-help-plugin 描述插件
1)intro:运行以下命令来获取  maven-compiler-plugin2.1  版本的信息:


2)值得一提的是 目标前缀:其作用是方便在命令行直接运行插件;(干货——引入了目标前缀)
2.1)看个荔枝: maven-compiler-plugin 的目标前缀是 compiler。
2.2)在描述插件的时候,还可以省去版本信息,让 maven 自动获取最新版本来进行表述, 如: mvn help:describe-Dplugin=org.apache.maven.plugins:maven-compiler-plugin
2.3)进一步简化:可以使用插件目标前缀来替换坐标: mvn help:describe-Dplugin=compiler
2.4)想仅仅描述某个插件目标的信息,可以加上 goal 参数:
mvn help:describe-Dplugin=compiler-Dgoal=compile
2.5)想让  maven-help-plugin 输出更详细的信息,可以加上 detail参数:
 mvn help:describe-Dplugin=compiler-Ddetail

【7】 从命令行调用插件
1)intro:运行mvn -h 来显示 mvn 命令帮助:
D:\classical_books\java_set\maven_in_action\mycode\chapter3>mvn -h
usage: mvn [options] [<goal(s)>] [<phase(s)>]
2)我们可以通过mvn 命令激活生命周期阶段,从而执行那些绑定在生命周期阶段上的插件目标;
3)maven 还支持:直接从命令行调用插件目标,因为这些任何不适合绑定在生命周期上,这些插件目标应该通过如下方式使用:
mvn help:describe-Dplugin=compiler
mvn dependency:tree
4)problem+solutions:
4.1)problem:为什么不是 mavnen-dependency-plugin:tree 而是 dependency:tree ?
4.2)solutions:可以尝试如下命令:
mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe-Dplugin=compiler
mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree
4.2.1)上面的命令一对比,显然 前面的目录更加简洁,更容易使用;
4.2.2)这也是 maven 引入 目标前缀的原因: help 是 maven-help-plugin 的目标前缀, 而 dependency 是 maven-dependency-plugin 的前缀,有了插件前缀,maven 就能够找到对应的 artifactId;不过 除了 artifactId ,maven 还需要得到 groupId 和 version 才能确定到 某个插件;

【8】插件解析机制
【8.1】插件仓库
1)intro:与依赖构建一样,插件构件同样基于坐标存储在 maven 仓库中:在需要的时候,maven 会从本地仓库中寻找插件,如果不存在,则从远程插件仓库查找。找到插件后,再下载到 本地仓库使用;
2)maven 会 区别对待依赖的远程仓库与插件的远程仓库:当maven 需要的依赖在本地仓库不存在时,它会去所配置的远程仓库中查找,可是当 maven 需要的插件在本地仓库中不存在时,它就不会去 这些远程仓库中查找;
3)插件的远程仓库使用 pluginRepositories 和 pluginRepository 配置,maven 内置了如下的插件远程仓库配置;

【8.2】插件的默认 groupId
1)intro:在 pom 中配置插件的时候,如果该插件是 maven 的官方插件,就可以省略 groupId 配置,见如下代码:(Attention——原书作者不推荐这种做法,即望补全groupId)


【8.3】解析插件版本
1)intro:maven 在超级POM 中为所有核心插件设定了版本,超级 POM 是所有maven 项目的父 POM,所有项目都继承这个超级 POM 的配置,因此,即使用户不加任何配置,maven 使用核心插件的时候,他们的版本就已经确定了;
2) 如果用户使用某个插件的时候没有设定版本,而这个插件又不属于 核心插件的范畴, maven 就会去 检查所有 仓库中可用的版本,然后做出选择;
3)依赖maven 解析插件版本是不推荐的做法: 即使 maven3 将版本解析到最新的非快照版,其还是存在潜在的不稳定性;

【8.4】 解析插件前缀
1)intro:maven 如何 根据插件前缀解析得到插件的坐标;
2)插件前缀用户 groupId:artifactId 是一一对应的,这种匹配关系存储在仓库元数据中;
3)maven在解析插件仓库元数据的时候,会默认使用 org.apache.maven.plugins 和 org.codehaus.mojo 两个 groupId。也可以通过配置 settings.xml 让 maven 检查其他groupId 上的 插件仓库元数据:
<settings><pluginGroups><pluginGroup>com.your.plugins</pluginGroup></pluginGroups>
</settings>
对以上代码的分析(Analysis): maven 不仅仅会检查 org/apache/maven/plugins/maven-metadata.xml 和  org/codehaus/mojo/maven-metadata.xml ,还会检查 com/your/plugins/maven-metadata.xml;
4)看看插件仓库元数据的内容,如下:

对以上代码的分析(Analysis): 
A1)上述内容是从 中央仓库的 org.apche.maven.plugins groupId 下插件仓库元数据中截取的一些片段,从这段数据中就能看到 maven-clean-plugin 的前缀为 clean,maven-compile-plugin 的前缀为 compiler, maven-dependency-plugin 的前缀为 dependency;
A2)当maven 解析到 dependency:tree 这样的命令后,他首先基于 默认的 groupId 归并所有插件仓库的元数据 org/apache/maven/plugins/maven-metadata.xml; 其次检查归并后的元数据, 找到对应的 artifactId 为 maven-dependency-plugin; 然后结合当前元数据的 groupId org.apache.maven.plugins;最后使用 章节8.3 的方法解析得到 version,从而得到完整的插件坐标;


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

datagrid的文字换行与连续字符串换行处理,字符串三种截取方式

1 文字自动换行&#xff1a;nowrap:false 2 当时字符串&#xff0c;比如email这样的字段时&#xff0c;就需要用到字符串的拼接&#xff0c;首先&#xff0c;先贴出我解决问题的方法&#xff0c;再介绍字符串的三种拼接方式&#xff1a; 我解决问题的方法&#xff1a; {titl…

1分钟了解“区块链分叉”的本质

转载自 1分钟了解“区块链分叉”的本质 有不少朋友问&#xff0c;全球每个区块链节点都包含全部数据&#xff0c;都在最新的区块链数据上挖符合条件的区块&#xff0c;如何两个节点同时挖到新区块&#xff0c;出现数据不一致&#xff0c;该怎么办呢&#xff1f; 今天&#xff0…

sql server数据库:创建数据库、建立数据库用户、为用户赋予权限

1 使用sql创建数据库 use test go create database test2 on primary (nametest2_data, -- 主文件逻辑名filenameD:\DataSqlserver\test2_data.mdf,--物理路径size5MB,filegrowth15% ) log on (nametest2_log,filenameD:\DataSqlserver\test2_log.ldf, --日志物理文件名size…

review_core_basic_java(1)java程序设计概述

【0】README1&#xff09;本文部分文字描述转自 “core java volume 1” 旨在review “review_core_basic_java(1)java程序设计概述” 的相关知识&#xff1b;【1】 java 程序设计平台 【2】 java 白皮书的关键术语0&#xff09;intro&#xff1a;java的设计者编写了颇有影响力…

全球如何保证区块生成是匀速的?

转载自 全球如何保证区块生成是匀速的&#xff1f; 区块链有个特点&#xff1a;虽然大家都在采矿&#xff0c;但挖到矿的速度是均匀的。以承载比特币的区块链为例&#xff0c;平均每10分钟产出一个区块&#xff0c;这个速度基本是不变的。 有朋友就有疑问了&#xff0c;计算能力…

hibernate关联映射:多对一、一对一

配置对象关联关系 - 单向一对多关系 - 例如&#xff1a;班级与学生 Grade类中 public class Grade{private int gid;private String gname;private String gdesc;private Set student new HashSet();//set实现班级与学生的一对多关系 } Grade.hbm.xml中 <hibernate-m…

dom4j-cookbook

【0】README1&#xff09;本文译自http://dom4j.sourceforge.net/dom4j-1.6.1/cookbook.html 2&#xff09;intro&#xff1a; 2.1&#xff09;dom4j 是一个对象模型&#xff0c;在内存中表示一颗XML 树。dom4j 提供了易于使用的API以提供强大的处理特性&#xff0c;操纵或控制…

Spring 整合 Quartz 分布式调度

转载自 Spring 整合 Quartz 分布式调度本文旨在对 SpringQuartz 分布式调度有一个直观的了解&#xff0c;通过实际的使用来解决问题。前言为了保证应用的高可用和高并发性&#xff0c;一般都会部署多个节点&#xff1b;对于定时任务&#xff0c;如果每个节点都执行自己的定时任…

使用vo注释做一个poi导出功能

1 jsp中&#xff1a; <a href"${basePath}/manage/bulletinAction.do?methodexportMainProduct&is18th1">导出公司主营产品</a> 2 action中&#xff1a; /*** 导出主营产品*/public void exportMainProduct(ActionMapping mapping, ActionForm fo…

java_basic_review(5) java继承

【0】README1&#xff09;本文主要对 java 继承的一些 重点知识进行复习&#xff1b;2&#xff09;for source code&#xff0c; please visit java_basic_review(5)源代码3&#xff09; proj dir tree【1】super 和 this 的比较1&#xff09;this的用途&#xff1a;一是引用隐…

无监督学习的魅力

转载自 无监督学习的魅力 如果你的一大坨数据没。有。标。签&#xff0c;怎么办&#xff1f; 无监督学习是机器学习算法里非常扑朔迷离的一个类别&#xff0c;负责解决这些“没有真实值 (no-ground-truth) ”的数据。 本文会讲到&#xff0c;无监督学习到底是什么&#xff0c;和…

log4j入门实例

http://www.codeceo.com/article/log4j-usage.html

java_basic_review(5)java反射荔枝

【0】README 1&#xff09;本文旨在 review java反射荔枝&#xff1b; 【1】荔枝如下 【2】实例化Class类对象 Test // 实例化Class类对象public void testInitializeClassObject() {Class c1;Class c2;Class c3;try {c1 Demo.class; // way1.c2 new Demo().getClass(); //…

Java单链表反转

转载自 Java单链表反转 详细过程 &#xff08;一&#xff09;单链表的结点结构:  data域&#xff1a;存储数据元素信息的域称为数据域&#xff1b;  next域&#xff1a;存储直接后继位置的域称为指针域&#xff0c;它是存放结点的直接后继的地址&#xff08;位置&…

java实现压缩图片的方法

前段时间在使用对图片加水印后&#xff0c;由于需加水印的图片的宽度和高度都非常的大&#xff0c;加了水印后图片从几百KB&#xff0c;变成了几MB&#xff0c;严重影响了图片在页面的加载速度&#xff01; 经过仔细的琢磨&#xff0c;决定先对图片进行压缩&#xff0c;再加水…

openfire log4j:ERROR setFile(null,true) call failed.

【0】README 1&#xff09;本文旨在解决 当 openfire server 启动时的报错信息&#xff1b; 【2】errors solutions 【2.1】errors log4j:ERROR setFile(null,true) call failed. java.io.FileNotFoundException: C:\Program Files (x86)\Openfire\bin\..\logs\all.log (…

用js处理图片加载错误时加载默认图片的方法

jsp <img src"${bulletin.logo }" onerror"onfind(this);" > js代码 <script type"text/javascript"> function onfind(img){img.src"/front/images/logo_wutu.jpg";img.onerrornull; } </script>

异常org.xmlpull.v1.XmlPullParserException

【0】对 org.xmlpull.v1.XmlPullParserException 异常的解决方法 Exception in thread "main" java.lang.ExceptionInInitializerErrorat org.jivesoftware.smack.SmackConfiguration.getVersion(SmackConfiguration.java:96)at org.jivesoftware.smack.AbstractXMPP…

跳跃表(Skip list)原理与java实现

转载自 【算法导论33】跳跃表&#xff08;Skip list&#xff09;原理与java实现Skip list是一个用于有序元素序列快速搜索的数据结构&#xff0c;由美国计算机科学家William Pugh发明于1989年。它的效率和红黑树以及 AVL 树不相上下&#xff0c;但实现起来比较容易。作者Willia…

简单的hibernate环境搭建、自动生成model/配置/hibernate.xml配置文件

自己亲测的东西才是最有效果的&#xff0c;下面贴出整个编写的过程。 1 hibernate环境搭建&#xff0c;这个博客非常给力&#xff1a;http://www.111cn.net/wy/js-ajax/93142.htm 需要用到的jar包&#xff1a; 2 使用myeclipse自动生成model/model配置文件/hibernate.xml配…