天天看點

一起學Maven(Maven聚合和繼承)<四>

前情回顧

    在上一章節中,通過三個子產品的項目開發,講解了Maven依賴管理的特性,進而對Maven依賴的表現,範圍等有着一定的認識,但每次對一個子產品進行更改,都要将對應子產品進行test或者package或者install的操作後,使用到該子產品的項目才可以使用,這樣的操作有些繁瑣,如果有過多的子產品,那将需要執行多次的操作,還有,在每個子產品pom.xml檔案中,存在很多之前子產品相同的依賴包,并且以後開發時候還會有很多相同的常量。

問題引出

    能不能執行一次指令就可以完成對每個子產品的操作?(Maven的聚合)

    能不能不要在每個子產品中都要定義相同的依賴包或者重複的元素呢?(Maven的繼承)

聚合和繼承的實作

    在實作過程中,将繼續使用上一個章節建構的項目子產品,并在上進行更改,如果沒有項目概念的,可以參考上一章節的講解,建構相應的項目。

    聚合繼承的操作隻要在項目子產品的目錄中建立實作的pom.xml檔案,然後在pom.xml檔案中定義相應的操作即可,如下圖所示

一起學Maven(Maven聚合和繼承)<四>

                     圖1

    但在這裡我們可以通過Eclipse建構pom.xml檔案(可以同時進行聚合和繼承的操作),可以通過以下步驟

一起學Maven(Maven聚合和繼承)<四>

                         圖2

一起學Maven(Maven聚合和繼承)<四>

                       圖3

一起學Maven(Maven聚合和繼承)<四>

                          圖4

    然後生成pom.xml檔案

一起學Maven(Maven聚合和繼承)<四>

                          圖5

    此時聚合的實作,隻要在pom.xml中添加聚合的子產品即可,實作的操作如下所示:

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.steven.user</groupId>
	<artifactId>user-parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	
	<modules>
		<module>../user-core</module>
		<module>../user-log</module>
		<module>../user-service</module>
	</modules>
	
</project>
           

注意:

    這裡的<module>子產品中../是指代上一級目錄,因為在Eclipse中需要指向上一級才可以引入相應的子產品。

    這時候,對parent子產品執行clean操作,會發現其包含的每個子產品都已經執行了操作,

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] user-core
[INFO] user-log
[INFO] user-service
[INFO] user-parent
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building user-core 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ user-core ---
[INFO] Deleting E:\Workspaces\STSWorkspace\user-core\target
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building user-log 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ user-log ---
[INFO] Deleting E:\Workspaces\STSWorkspace\user-log\target
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building user-service 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ user-service ---
[INFO] Deleting E:\Workspaces\STSWorkspace\user-service\target
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building user-parent 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ user-parent ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] user-core ......................................... SUCCESS [0.255s]
[INFO] user-log .......................................... SUCCESS [0.014s]
[INFO] user-service ...................................... SUCCESS [0.015s]
[INFO] user-parent ....................................... SUCCESS [0.002s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.500s
[INFO] Finished at: Mon Feb 17 21:21:50 CST 2014
[INFO] Final Memory: 4M/15M
[INFO] ------------------------------------------------------------------------
           

    下面進行繼承的操作,繼承的操作在這裡主要對依賴和常量進行配置,配置後的pom檔案依次是

user-parent中pom.xml

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.steven.user</groupId>
	<artifactId>user-parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>

	<modules>
		<module>../user-core</module>
		<module>../user-log</module>
		<module>../user-service</module>
	</modules>

	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>4.10</version>
				<scope>test</scope>
			</dependency>

			<dependency>
				<groupId>log4j</groupId>
				<artifactId>log4j</artifactId>
				<version>1.2.14</version>
			</dependency>
			<dependency>
				<groupId>org.hibernate</groupId>
				<artifactId>hibernate-core</artifactId>
				<version>4.1.1.Final</version>
			</dependency>

			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>5.1.8</version>
			</dependency>

			<dependency>
				<groupId>dom4j</groupId>
				<artifactId>dom4j</artifactId>
				<version>1.5</version>
			</dependency>

			<dependency>
				<groupId>${project.groupId}</groupId>
				<artifactId>user-core</artifactId>
				<version>${project.version}</version>
			</dependency>

			<dependency>
				<groupId>${project.groupId}</groupId>
				<artifactId>user-log</artifactId>
				<version>${project.version}</version>
				<exclusions>
					<exclusion>
						<groupId>dom4j</groupId>
						<artifactId>dom4j</artifactId>
					</exclusion>
				</exclusions>
			</dependency>

		</dependencies>
	</dependencyManagement>
</project>
           

user-core中pom.xml

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>com.steven.user</groupId>
		<artifactId>user-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<relativePath>../user-parent/pom.xml</relativePath>
	</parent>

	<artifactId>user-core</artifactId>
	<packaging>jar</packaging>

	<name>user-core</name>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
	</dependencies>
</project>
           

user-log中pom.xml

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.steven.user</groupId>
		<artifactId>user-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<relativePath>../user-parent/pom.xml</relativePath>
	</parent>
	<artifactId>user-log</artifactId>
	<packaging>jar</packaging>

	<name>user-log</name>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency>

		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
		</dependency>
	</dependencies>
</project>
           

user-service中pom.xml

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.steven.user</groupId>
		<artifactId>user-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<relativePath>../user-parent/pom.xml</relativePath>
	</parent>
	<artifactId>user-service</artifactId>
	<packaging>jar</packaging>

	<name>user-service</name>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency>


		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>user-core</artifactId>
		</dependency>

		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>user-log</artifactId>
		</dependency>

	</dependencies>
</project>
           

    此時即可完成繼承的操作,會發現user-core,user-log,user-service中版本号,依賴範圍,排除依賴都不需要寫了,隻要都寫在父檔案中就可以了,這樣就減少了很多重複代碼的編寫了。

總結

    此時就可以通過父類user-parent執行聚合繼承操作後,對其他子產品進行統一管理,這裡有幾個提示點:

    1、通過聚合就可以共同操作,通過繼承就可以解決jar沖突,排除依賴一樣可以寫在父檔案中,

    2、在Eclipse中進行對子產品依賴的控制,可以先将一個子產品的所有依賴放到父檔案的<dependencyManagement>節點下,然後在該子產品中Eclipse會有重複的提示,删除重複行即可,然後在其他子產品中先對重複行進行删除,對父檔案中沒有的依賴進行拷貝。

    在此預祝大家學習愉快!有任何錯誤或者問題可以提出,在此不勝感激!