maven插件详解

1.maven的生命周期
maven的生命周期,其实是对项目构建生命周期的抽象与统一。命令行的输入,就是对应了生命周期,例如mvn package就是执行默认生命周期的package阶段。以下的模板方法可以体现出maven生命周期的概念:

public abstract class AbstractBuild {
	public void build() {
		initialize();
		compile();
		test();
		package();
		integrationTest();
		deploy();
	}
	protected abstract void initialize();
	protected abstract void compile();
	protected abstract void test();
	protected abstract void package();
	protected abstract void integrationTest();
	protected abstract void deploy();
}

maven的生命周期不是一个整体,而是有三套相互独立的生命周期,分别是clean(清理项目)、default(构建项目)和site(建立项目站点)。而每个生命周期有包含了不同的阶段,下面来列出(阶段是按执行顺序来排列的):

  • clean:pre-clean/clean/post-clean
  • default:validate/initialize/generate-sources/process-sources/generate-resources/process-resources/compile/process-classes/generate-test-sources/process-test-sources/generate-test-resources/process-test-resources/test-compile/process-test-classes/test/prepare-package/package/pre-integration-test/integration-test/post-integration-test/verify/install/deploy
  • site:pre-site/site/post-site/site-deploy

maven的三个生命周期之间是独立的,但是一个生命周期的每个阶段是前后依赖的。例如,当执行mvn clean时,实际上执行的是pre-clean和clean两个阶段。当执行mvn install时,实际上执行了install前的所有阶段,但它不会执行clean生命周期。
再回到上面的模板方法,maven的生命周期其实是抽象的,本身不会做任何的工作。实际工作都是交给插件来完成的,如package阶段的任务会由maven-jar-plugin来完成。
2.maven中的插件
(1)插件目标
上面提到,maven生命周期中的具体工作是由插件完成的。具体来说,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。那什么是插件目标呢?
maven
对于插件而言,为了能够代码复用,往往都具有多个功能。比如maven-dependency-plugin,它能分析项目依赖,能列出项目的依赖树,还能够列出项目已解析的依赖等等。我们不能够为每个功能来编写一个插件,因为这样代码无法复用。所以把这些功能聚集在一个插件里,每个功能就是一个目标。
(2)插件绑定
下面的配置给出了怎样将生命周期的阶段与插件的目标相互绑定。

<plugin>
	<groupId>org.apache.avro</groupId>
	<artifactId>avro-maven-plugin</artifactId>
	<version>1.7.6</version>
    <configuration>
		<sourceDirectory>${project.basedir}/source/</sourceDirectory>
		<outputDirectory>${project.basedir}/target/</outputDirectory>
	</configuration>
	<executions>
		<execution>
			<phase>generate-sources</phase>
			<goals>
				<goal>schema</goal>
			</goals>
		</execution>
	</executions>
</plugin>

使用groupId、artifactId和version三个标签指定使用的maven插件,phase标签表示生命周期的某个阶段,goal标签设置插件的目标,configuration标签用来对插件进行配置(不同的插件有不同的配置项)。
(3)内置绑定
使用maven时,几乎不用配置便可以构建项目。这是因为maven为一些重要的生命周期阶段预先绑定了很多插件的目标。例如clean生命周期的clean阶段,预先与maven-clean-plugin:clean绑定。default生命周期的compile阶段,预先与maven-compiler-plugin:compile阶段绑定。我们可以在pom重新配置内置插件。

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>3.2</version>
	<configuration>
		<source>1.8</source>
		<target>1.8</target>
	</configuration>
</plugin>

上面的插件设置了jdk版本为1.8(默认为1.5)。
运行maven,在控制台上可以看到生命周期阶段与插件目标的绑定关系。

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.2:compile (default-compile) @ test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 5 source files to /Users/zhengyi/Desktop/workspace/test/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/zhengyi/Desktop/workspace/test/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.2:testCompile (default-testCompile) @ test ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ test ---
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ test ---
[INFO] Building jar: /Users/zhengyi/Desktop/workspace/test/target/test-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ test ---
[INFO] Installing /Users/zhengyi/Desktop/workspace/test/target/test-0.0.1-SNAPSHOT.jar to /Users/zhengyi/.m2/repository/com/ee/test/0.0.1-SNAPSHOT/test-0.0.1-SNAPSHOT.jar
[INFO] Installing /Users/zhengyi/Desktop/workspace/test/pom.xml to /Users/zhengyi/.m2/repository/com/ee/test/0.0.1-SNAPSHOT/test-0.0.1-SNAPSHOT.pom

4 Replies to “maven插件详解”

发表评论