maven pom进阶教程 - 插件与继承(plugin & inherite)

原创
2017/01/31 22:33
阅读数 1.7W

插件是maven的核心,所有的功能都要通过插件来完成。 #插件配置的基本格式 本例是以maven-resources-plugin为例

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-resources-plugin</artifactId>
	<version>3.0.2</version>
	<inherited>true</inherited>
	<configuration><!--有的插件识别这个位置,有的不识别,有的都识别-->
		<skip>false</skip><!--只有部分插件支持这个功能-->
	</configuration>
	<executions>
		<execution>
			<id>default-resources</id>
			<phase>process-resources</phase>
			<goals>
				<goal>resources</goal>
			</goals>
			<configuration><!--有的插件不识别这个位置的configuration-->
				<skip>true</skip><!--只有部分插件支持这个功能-->
			</configuration>
		</execution>
		<execution>
			<id>copy2</id>
			<phase>compile</phase>
			<goals>
				<goal>copy-resources</goal>
			</goals>
			<configuration>
				<skip>false</skip><!--只有部分插件支持这个功能-->
			</configuration>
		</execution>
	</executions>
</plugin>

inherited 插件是允许被继承。比如child使用parent标签继承其它的pom.xml, parent的pom.xml可以将插件的inherited设置为false, 从而避免child继承某个插件。

configuration 从示例可以看出,configuration的位置有两处:   1. 处于plugin结点   2. 处于execution结点 有的插件只识别位置1,比如exec-maven-plugin;
有的插件两个位置都识别,并采用继承的规则(见[插件的继承与覆盖]),比如maven-resources-plugin。
因此,最好是按照插件的官方例子来写, 避免不必要的调试。

skip 是否跳过execution, 只有部分插件支持这个功能,具体信息需要查看插件的参数。

executions,execution, 定义任务列表

id, 定义任务的id, 相当于任务名称,可以随便写,如果不写,则默认值为default(实践得出来的)。同个插件内的execution的id, 不能重复, 所以,包含多个任务时,需要设置为不同的id。maven的phase绑定的默认的插件的execution id的格式为default-<Goal>
执行mvn相关命令时,console上会打印被执行的execution的id, 例如:
[INFO] --- maven-compiler-plugin:3.6.0:compile (default-compile) @ my-child2 ---

[INFO] --- 插件的artifactId:插件的version:插件的goal (execution的id) @ 项目的artifactId ---

phase, 设置execution在哪个阶段执行。phase乱写,将导致execution不被执行。

goals,goal, 需要执行插件的哪些goal, 插件有哪些goal, 可以去官网上查。如果乱写,mvn命令将失败

#插件的继承与覆盖 如果pom继承了其它的pom.xml, plugin也会产生继承关系。parent中的plugin可以设置成无法被继承(似乎没什么意义)。默认情况下,maven会将parent和child的配置合并(如果元素存在,则覆盖)。以maven-resources-plugin来举例,parent的配置如下

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-resources-plugin</artifactId>
	<version>3.0.2</version>
	<configuration>
		<outputDirectory>${project.basedir}/target/</outputDirectory>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
		</resources>
		<encoding>UTF-8</encoding>
	</configuration>
</plugin>

child配置如下

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-resources-plugin</artifactId>
	<configuration>
		<resources>
			<resource>
				<directory>src/main/resources2</directory>
			</resource>
		</resources>
	</configuration>
</plugin>

child会继承version, outputDirectory, encoding这些属性,但是会覆盖resouces属性, 最终只拷贝了resource2中的资源
child可以在给元素加入 combine.children="append",将child的此元素属性与parent的属性拼接到一起, 例如:

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-resources-plugin</artifactId>
	<configuration>
		<resources combine.children="append">
			<resource>
				<directory>src/main/resources2</directory>
			</resource>
		</resources>
	</configuration>
</plugin>

这样配置后,child将同时拷贝resouce和resource2中的资源. child也可以使用 combine.self="override",完全覆盖parent的属性
在开发工具eclipse中,编辑pom.xml时,可切换成Effective POM视图,查看最终生成的pom配置
#pluginManagement 在<build>结点下,plugins可以处于两个地方
1 pluginManagement结点下

	 <build>
		<pluginManagement>
			<plugins></plugins>
		</pluginManagement>
	</build>
    ```  
2  <build>根结点下  
 <build>
	<plugins></plugins>
</build>
这二者的唯一区别是,只有当child的pom.xml使用了某个插件,pluginManagement下的对应插件才会生效.  
**!但是,需要注意的是,有些插件会被自动调用,比如将resources插件写在pluginManagement,无论child有没有使用resources插件,它都会生效,因process-resources阶段已经绑定了它,肯定会被调用**
展开阅读全文
加载中

作者的其它热门文章

打赏
2
1 收藏
分享
打赏
0 评论
1 收藏
2
分享
返回顶部
顶部