閱讀333 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《maven實戰》讀書筆記6——maven聚合和繼承

maven聚合

為什麼要用maven聚合

隨著互聯網的發展,一個項目的業務複雜度越來越高,整個項目的業務代碼也會越來越龐大,因此便有了把一個項目拆分成若幹個子項目的需求。
根據之前的知識,clean、test、package、install等都是針對單獨的項目,那麼對於上邊若幹個子項目可能就需要執行若幹次的clean、test、package、install等操作,而這些操作具有很高的重複性。
介於這樣的前提,便需要使用到maven聚合,經過一定的配置後,可以讓我們每一次clean或者test或者package等都同時對所有子模塊生效,大大減少了重複工作。

maven聚合怎麼用

根據上邊的前提可以知道,屬於同一個項目的子項目,或者說子模塊,規範性的配置應該是他們groupId都一樣,version也一樣,隻有artifactId不同。
例如有這樣兩個子項目mytest-project1、mytest-project2,他們的pom.xml的必要配置分別如下:
myporject1的pom.xml:

  <modelVersion>4.0.0</modelVersion>
  <groupId>my.maven.test</groupId>
  <artifactId>mytest-project1</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>mytest-project1 Maven Webapp</name>

myporject2的pom.xml:

  <modelVersion>4.0.0</modelVersion>
  <groupId>my.maven.test</groupId>
  <artifactId>mytest-project2</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>mytest-project2 Maven Webapp</name>

那麼就可以再創建一個隻有pom.xml的項目作為聚合這兩個子項目的父項目,這個父項目的pom.xml的必要配置如下:

  <modelVersion>4.0.0</modelVersion>
  <groupId>my.maven.test</groupId>
  <artifactId>mytest-project0</artifactId>
  <packaging>pom</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>mytest-project0 Maven Webapp</name>
  <modules>
     <module>mytest-project1</module>
     <module>mytest-project2</module>
  </modules>

對比之下可以知道看到,這個父項目的配置中modelVersion、groupId、version都和子項目的一模一樣。其他除開artifactId、name本身每個maven項目都應該不一樣之外,還有packaging的值不一樣,並且還多了一個modules屬性,而packagingmodules這兩個屬性就是maven聚合最重要的屬性了。
首先,用來作為聚合其他子項目的父級項目的packaging的值必須是pom,也隻能是pom
然後modules中配置了需要聚合的子項目的列表。
如上邊例子中配置的子項目列表是什麼意思呢?比如<module>mytest-project1</module>,這個其實指像的是一個pom.xml文件,也就是工作空間/mytest-project0/mytest-project1/pom.xml,說的更簡單點,就是需要把子項目mytest-project1放到mytest-project0裏邊。
那麼如果mytest-project1和mytest-project0位於同級目錄怎麼辦呢?這個聚合的modules裏的配置就要該成這樣:

<module>../mytest-project1</module>

由此其實可以看到,這個module裏邊的配置實際上就是一個相對路徑,是相對於當前這個pom.xml(聚合項目的pom.xml)的相對路徑。
例如<module>mytest-project1</module>,其實就是mytest-project0/pom.xml所在目錄下的mytest-project1,而<module>../mytest-project1</module>,其實就是mytest-project0/pom.xml所在目錄的上一級目錄中的mytest-project1,../代表上一級目錄,這個應該能來學maven的人都知道。
經過上邊這樣配置之後,那麼我們隻需要對這個聚合父項目進行clean等操作,就會同時對配置的各子模塊生效,例如執行clean,那麼mytest-project1和mytest-project2下邊的target就都會被清理掉,執行package,那麼mytest-project1和mytest-project2就都會執行package操作,然後在各自的target目錄下生成各自的輸出文件,這些結果在執行操作的時候就可以再控製台看到信息輸出,例如執行clean,就會如下:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] mytest-project1 Maven Webapp
[INFO] mytest-project2 Maven Webapp
[INFO] mytest-project0 Maven Webapp
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building mytest-project1 Maven Webapp 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mytest-project1 ---
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building mytest-project2 Maven Webapp 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mytest-project2 ---
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building mytest-project0 Maven Webapp 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mytest-project0 ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] mytest-project1 Maven Webapp ....................... SUCCESS [  0.164 s]
[INFO] mytest-project2 Maven Webapp ....................... SUCCESS [  0.004 s]
[INFO] mytest-project0 Maven Webapp ....................... SUCCESS [  0.003 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.272 s
[INFO] Finished at: 2017-11-14T15:07:59+08:00
[INFO] Final Memory: 6M/123M
[INFO] ------------------------------------------------------------------------

maven繼承

maven繼承的作用其實和java中繼承的作用是類似的,基本上都是主要為了實現重用,java中類的繼承,減少了重複的代碼,而maven中的繼承則減少了pom.xml的配置。
因此顯而易見的是,這裏所說的maven繼承更確切的說,應該指的是pom.xml配置的繼承。
說到繼承,自然是需要有父類和子類,那麼引申到這裏,就需要有父的pom.xml和子pom.xml,例如我這裏有一個父項目pom.xml的必要內容如下:

  <modelVersion>4.0.0</modelVersion>
  <groupId>my.maven.test1</groupId>
  <artifactId>mytest-project00</artifactId>
  <packaging>pom</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>mytest-project00 Maven Webapp</name>
  <url>https://maven.apache.org</url>
  <dependencies>
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-webmvc</artifactId>
         <version>4.3.9.RELEASE</version>
     </dependency>
  </dependencies>
  <build>
    mytest-project00</finalName>
  </build>

這個配置隻顯示的引用了spring-webmvc的依賴,所以會導入spring-webmvc及它所依賴的所有jar包,這個項目看起來和一個普通的maven項目幾乎沒有區別,唯一不同的就是,他的packaging和聚合一樣也是pom才行。
那麼如果我們有一個子項目也需要使用spring-webmvc,就可以繼承這個項目的pom.xml,而不需要再另行配置spring-webmvc的依賴,例如子項目的pom.xml如下:

  <modelVersion>4.0.0</modelVersion>
  <groupId>my.maven.test1</groupId>
  <artifactId>mytest-project01</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT<
  <name>mytest-project01 Maven Webapp</name>
  <parent>
     <groupId>my.maven.test1</groupId>
     <artifactId>mytest-project00</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <relativePath>../mytest-project00/pom.xml</relativePath>
  </parent>
  <url>https://maven.apache.org
  <dependencies>
  </dependencies>
  <build>
    <finalName>mytest-project01</finalName>
  </build>

很明顯的可以看到,上邊的配置中並沒有顯示的配置任何依賴,但是多了一個parent的配置,而這個配置就是繼承父項目的關鍵配置。
在parent中,groupId、artifactId、version這幾個坐標的配置相信不用多說,關鍵在於relativePath,這個屬性指定了maven父項目的pom.xml的路徑,當然了,這裏也是配置的相對於當前pom.xml的相對路徑。
有了這個配置之後,mytest-project01不需要顯示的配置對spring-webmvc的依賴,就會導入相應的依賴,也就是繼承了mytest-project00的pom.xml的配置。

pom.xml中有很多的屬性,這些屬性並非都能繼承,根據我目前的工作狀況,我覺得需要知道有這麼回事就好了,因此暫時便不做更深入的了解。
maven聚合和maven繼承可以讓我們的maven開發過程更加簡潔,兩個可以結合在一起使用,既然知道了怎麼聚合,也知道了怎麼繼承,那麼結合在一起使用應該就不用多說了。

最後更新:2017-11-14 16:34:27

  上一篇:go  org.springframework.web.context.ContextLoaderListener
  下一篇:go  解析Kafka High Available