如今是微服務盛行時代,說不許哪一天領導就會讓你對一個大項目進行重構。大項目的痛點:編譯慢、發佈繁瑣等。就像下面這張圖:web
真的不敢動呀,一不當心就坍塌了。面試
好比說咱們用戶系統,咱們能夠這麼重構(這裏只是舉例,每一個項目拆分目的可能不一樣)。apache
user-system拆分紅:maven
-
user-web
微服務 -
user-service
測試 -
user-dao
ui -
user-common
spa
咱們對其拆分後頗有可能存在多個子項目中同時依賴某個jar包,若是使用不當可能會致使每一個模塊使用的版本不同,因此想一想能不能有什麼方式來解決這類問題呢?插件
答案:能。可是得先了解兩個概念:聚合和繼承。3d
聚合
所謂的聚合就是咱們若是想一次性構建多個項目模塊,那咱們就須要把這些項目模塊進行聚合。
配置模板
<modules> <module>項目模塊一</module> <module>項目模塊二</module> <module>項目模塊三</module> <module>項目模塊...</module> </modules>
使用方式
好比咱們對user-web、user-service、user-dao、user-common四個項目模塊進行聚合。
<modules> <module>user-web</module> <module>user-service</module> <module>user-dao</module> <module>user-common</module> </modules>
注意:其中module的路徑爲相對路徑。
這樣就解決了咱們項目模塊的聚合,咱們再來看看maven是如何來解決因爲重複依賴致使版本不同的問題。
繼承
繼承爲了消除重複,咱們把不少相同的配置提取出來,例如:grouptId,version等 。
繼承的配置
<parent> <artifactId>maven-demo</artifactId> <groupId>com.tian</groupId> <version>1.0-SNAPSHOT</version> </parent>
繼承代碼中定義屬性
繼承代碼過程當中,能夠定義屬性,例如:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.13.1</junit.version> <maven.version>0.0.1-SNAPSHOT</maven.version> </properties>
訪問屬性的方式爲${junit.version},例如:
<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>maven-demo</artifactId> <groupId>com.tian</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-web</artifactId> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- 使用了parent中 junit.version --> <version>${junit.version}</version> </dependency> </dependencies> </project>
這樣咱們就可使用到上面定義的屬性junit.version=4.13.1。
父模塊用dependencyManagement進行管理
因爲項目模塊較多,因此咱們又抽象了一層,抽出一個parent來管理子項目的公共的依賴。爲了項目的正確運行,必須讓全部的子項目使用依賴項的統一版本,必須確保應用的各個項目的依賴項和版本一致,才能保證測試的和發佈的是相同的結果。
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
這樣的好處是子模塊能夠有選擇性的繼承,而不須要所有繼承。
這樣作的好處:統一管理項目的版本號,確保應用的各個項目的依賴和版本一致,才能保證測試的和發佈的是相同的成果,所以,在頂層pom中定義共同的依賴關係。同時能夠避免在每一個使用的子項目中都聲明一個版本號,這樣想升級或者切換到另外一個版本時,只須要在父類容器裏更新,不須要任何一個子項目的修改;若是某個子項目須要另一個版本號時,只須要在dependencies中聲明一個版本號便可。子類就會使用子類聲明的版本號,不繼承於父類版本號。
聚合和繼承的關係
在前面咱們構建多模塊項目中,關係以下
mavendemo就是user-web、user-service等幾個模塊的父項目。
父項目主要是用來配置一些公共的配置,其它三個項目再經過繼承的方式擁有父項目中的配置,首先配置父項目的pom.xml,添加對項目的user-web
、user-service
、user-dao
、user-common
這四個模塊進行聚合以及jar包依賴。
相對於dependencyManagement,全部生命在dependencies裏的依賴都會自動引入,並默認被全部的子項目繼承。
面試題:dependencyManagement和dependencies的區別
-
dependencyManagement裏只是聲明依賴,並不實現引入,所以子項目須要顯示的聲明須要用的依賴。若是不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,而且沒有指定具體版本,纔會從父項目中繼承該項,而且version和scope都讀取自父pom;另外若是子項目中指定了版本號,那麼會使用子項目中指定的jar版本。
-
dependencies即便在子項目中不寫該依賴項,那麼子項目仍然會從父項目中繼承該依賴項(所有繼承)。
IDEA中配置Maven
在使用IDEA開發時,如何將Maven配置呢?
打開IDEA,在File--->Settings。輸入欄搜索:maven
配置咱們以前安裝好的maven目錄、maven下面的setting.xml以及本地倉庫目錄。而後Apply--->OK。
咱們項目對某個項目進行clean 等操做的時候,就能夠直接雙擊Lifcycle下面的。
這樣咱們就把Maven集成到咱們的IDEA中來了。
編譯運行項目
咱們能夠在父項目中對全部子項目進行編譯、打包等。咱們就來對全部子模塊進行打包。
而後在對應子項目中能夠找到target目錄和對應的jar包。
也可單獨對某個子項目進行打包等操做。好比咱們對user-common進行clean。
因而,此時的user-common下的target已經被刪掉,其餘子項目中並無收到影響。
IDEA中如何建立多項目模塊
先建立一個user-parent的maven項目:
而後把src目錄刪掉,建立子項目:
選中user-parent項目,右鍵,選中New-->Module
來到New Module界面,選擇Maven,選好本身的本地安裝的JDK。
next。填寫子項目名稱,咱們這裏建立一個user-web的子項目:
注意這裏user-web,默認是userweb,須要咱們手工在兩個單詞之間添加橫線:
點擊Finish:
而後在看看user-parent的pom中的內容:
已經添加了modules,同時把咱們的user-web添加進去了。
一樣方法,咱們就能夠建立更多字項目了:
再看看user-parent中的pom.xml文件內容:
到這裏,咱們就輕輕鬆鬆的構建了咱們這個大項目user-parent,該項目包括了user-web,user-service,user-dao,-user-commmon子項目。
如果新建多模塊項目,安裝上面的步驟就搞定了。
如果大項目拆分,咱們就可使用上面的方式先建立好本身的多模塊項目,而後對應把大項目裏的內容拷貝到對應模塊中(須要注意此時子模塊直接確定會有相互依賴的)。
總結
經過繼承,咱們能夠定義項目的父類項目,用於繼承父項目的依賴、插件、屬性等信息。聚合就是咱們若是想一次性構建多個項目模塊,那咱們就須要對這些項目模塊進行聚合。
構建多模塊項目,在IDEA中使用建立Module的方式很輕鬆就能夠建立了。在父項目中使用來管理子模塊的依賴相關依賴。
對大項目進行重構時,只須要把各模塊拆分出來的代碼拷貝到對應子模塊就能夠了。
「沒有天生的信心,只有不斷培養的信心。」