《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
屬性,而packaging
和modules
這兩個屬性就是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