maven pom進階教程 - 插件與繼承(plugin & inherite)

插件是maven的核心,全部的功能都要經過插件來完成。 #插件配置的基本格式 本例是以maven-resources-plugin爲例apache

<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繼承某個插件。app

configuration 從示例能夠看出,configuration的位置有兩處:   1. 處於plugin結點   2. 處於execution結點 有的插件只識別位置1,好比exec-maven-plugin;
有的插件兩個位置都識別,並採用繼承的規則(見[插件的繼承與覆蓋]),好比maven-resources-plugin。
所以,最好是按照插件的官方例子來寫, 避免沒必要要的調試。eclipse

skip 是否跳過execution, 只有部分插件支持這個功能,具體信息須要查看插件的參數。maven

executions,execution, 定義任務列表ide

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命令將失敗ui

#插件的繼承與覆蓋 若是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階段已經綁定了它,確定會被調用**
相關文章
相關標籤/搜索