Maven繼承的實現以及統一版本(用eclipse操作實現)---》對maven依賴關係的理解--》聚合

目錄

1.Maven繼承的實現以及統一版本

1.1 建立父工程: 父工程的打包方式爲pom

1.2 在父工程的pom.xml中編寫依賴:

1.3 配置子類:

1.4 在子類中 需要聲明 :加上使用哪些父類的依賴

2 對maven依賴關係的理解

3 maven聚合

總結


1.Maven繼承的實現以及統一版本

maven可以由很多的工程組成,那麼要如何統一每個工程所用到的jar包都是同一個版本呢,例如A,B兩個工程,A用Junit4,B用Junit3.8,要合成一個項目時會不會出問題呢?(例子不一定嚴謹,大致這個意思)

好處:解決模塊之間jar包衝突問題

實現步驟:

1.1 建立父工程: 父工程的打包方式爲pom

注意1:打包方式有三種
java工程——jar
web項目-war
父工程-pom

注意2:這裏HelloWorld2是其子工程,打包方式爲jar,目錄結構顯然不一樣,因爲父工程相當於一個接口,只需聲明一下,無須實現

1.2 在父工程的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>org.lanqiao.maven</groupId>
  <artifactId>HelloWorldFather</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  
  <!-- 父工程,父工程的依賴的寫法 -->
  <dependencyManagement>
  	<dependencies>
  		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>compile</scope>
		</dependency>
  	</dependencies>
  </dependencyManagement>
</project>

1.3 配置子類:

 給當前工程 繼承一個父工程:1加入父工程座標gav   2當前工程的Pom.xml到父工程的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>org.lanqiao.maven</groupId> -->
	<artifactId>HelloWorld2</artifactId><!-- gouupid和version可以繼承父類而來,就artifactId不能省 -->
	<!-- <version>0.0.1-SNAPSHOT</version> -->
	

  <!-- 給當前工程 繼承一個父工程:1加入父工程座標gav   2當前工程的Pom.xml到父工程的Pom.xml之間的 相對路徑  --> 
  	<parent>
  		<!-- 1.給當前工程 繼承一個父工程:1加入父工程座標gav -->
  		<groupId>org.lanqiao.maven</groupId>
		<artifactId>HelloWorldFather</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		
		<!--2當前工程的Pom.xml到父工程的Pom.xml之間的 相對路徑  -->
		<relativePath>../HelloWorld2/pom.xml</relativePath>
  	</parent>

	
</project>

注意:此時按理說已經完事,但是父工程可能有非常多的依賴,子工程若是像子類必須實現所繼承接口裏面的所有聲明一樣,那子工程必然會引入非常多根本用不着的jar包,所以這裏就設置爲只有在子工程聲明我要用到這個依賴纔會繼承父類的

1.4 在子類中 需要聲明 :加上使用哪些父類的依賴

<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>org.lanqiao.maven</groupId> -->
	<artifactId>HelloWorld2</artifactId><!-- gouupid和version可以繼承父類而來,就artifactId不能省 -->
	<!-- <version>0.0.1-SNAPSHOT</version> -->
	

  <!-- 給當前工程 繼承一個父工程:1加入父工程座標gav   2當前工程的Pom.xml到父工程的Pom.xml之間的 相對路徑  --> 
  	<parent>
  		<!-- 1.給當前工程 繼承一個父工程:1加入父工程座標gav -->
  		<groupId>org.lanqiao.maven</groupId>
		<artifactId>HelloWorldFather</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		
		<!--2當前工程的Pom.xml到父工程的Pom.xml之間的 相對路徑  -->
		<relativePath>../HelloWorld2/pom.xml</relativePath>
  	</parent>

	<dependencies>
		
		<dependency>
			<!-- 聲明需要使用到父類的Junit(只用ga,無需version) -->
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency>

		
	</dependencies>


</project>

 這樣一來就好了,要驗證是否成功,保存更新後可以先點Effective POM,可以看見父類的Junit的版本信息已經被子類繼承了。 

 

2 對maven依賴關係的理解

   

若B依賴於A,B想要編譯成功,必須把A放入倉庫。

原因是所有的類實際上用的是都是倉庫裏的同一份jar包,並不是副本,也就是說自身引入的jar包實際上只是對應倉庫裏jar包的映射名字而已,如圖

我若想導入A這個jar包,實際上也並不是真的導入,而是對倉庫裏那唯一的一份 A jar包的映射(也可以這樣理解,若有成千上百的項目要用A這個jar包,不需要每個都複製一份A jar包,而是公用一份),這就是爲啥若A依賴於B ,必須把A放入倉庫,然後A要用B,只需提供B的gav就好。

 

好,進一步來深化問題。

假如A是B的父工程,C又依賴於B,那麼C若想編譯成功,必須同時把A與B放入倉庫。

先假設A本身有一個依賴junit

                <dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>compile</scope>
		</dependency>

B繼承A後,又擴展了一個依賴commons-io(故B共有junit和commons-io兩個依賴)

        <parent>
  		<!-- 1.給當前工程 繼承一個父工程:1加入父工程座標gav -->
  		<groupId>org.lanqiao.maven</groupId>
		<artifactId>A</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	
		<relativePath>../A/pom.xml</relativePath>
  	</parent>

	<dependencies>
		<dependency>
			<!-- 聲明需要使用到父類的Junit(只用ga,無需version) -->
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency> 

		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.3.1</version>		
		</dependency>
	</dependencies>

C依賴於B,自身無拓展(故C共有junit和commons-io兩個依賴)

<dependencies>
  	<dependency>
  		<groupId>org.lanqiao.maven</groupId>
		<artifactId>B</artifactId>
		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
   	
  </dependencies>

現在若想C編譯成功,先通過B的gav找到B所提供的jar(所以B需要放入倉庫),而B又要知道A所提供的jar(所以A需要放入倉庫)。若只放了B沒放A,那麼就只能找到commons-io而找不到junit。

還有一個需要注意的是,若是直接在C中加了junit的依賴,雖然C中的Junit會覆蓋A中的Junit,但是經驗證還是得把A放入倉庫。

總而言之,只要是被某個項目所依賴的統統都要加入倉庫中。

3 maven聚合

基於對繼承和依賴的理解,那麼聚合就比較容易了,它只做一件事,就是把一個子項目所依賴的所有父項目一起compile,test,package,install,無需我們關心先後順序。比如B依賴A,現在想compile B成功,那麼我們必須先手工install A,如果項目很多的時候就會理不清各自依賴的先後順序,此時用聚合這個一鍵話操作就會十分便利

類似寫法如下,注意聚合項目的打包方式必須爲pom

總結

我覺得繼承和依賴想做的事比較像,都是把自己已經標註的jar包的位置傳給他們的後代用,而後代若想用父代提供的jar包位置信息,必須把父代先打包放入倉庫,以此類推。在這個嵌套關係很深的情況下就很難理清各自的依賴先後關係,這時聚合的強大就體現出來了,我們只需在聚合裏聲明想操作的子代的所有上一級父代(包括父代的父代........),就無需理會父類的先後關係了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章