如今是微服務盛行時代,說不許哪一天領導就會讓你對一個大項目進行重構。大項目的痛點:編譯慢、發佈繁瑣等。就像下面這張圖:web
真的不敢動呀,一不當心就坍塌了。面試
好比說咱們用戶系統,咱們能夠這麼重構(這裏只是舉例,每一個項目拆分目的可能不一樣)。apache
user-system拆分紅:maven
user-web
user-service
user-dao
user-common
咱們對其拆分後頗有可能存在多個子項目中同時依賴某個jar包,若是使用不當可能會致使每一個模塊使用的版本不同,因此想一想能不能有什麼方式來解決這類問題呢?ide
答案:能。可是得先了解兩個概念:聚合和繼承。微服務
所謂的聚合就是咱們若是想一次性構建多個項目模塊,那咱們就須要把這些項目模塊進行聚合。測試
配置模板ui
<modules>
<module>項目模塊一</module>
<module>項目模塊二</module>
<module>項目模塊三</module>
<module>項目模塊...</module>
</modules>
好比咱們對user-web、user-service、user-dao、user-common四個項目模塊進行聚合。spa
<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。
因爲項目模塊較多,因此咱們又抽象了一層,抽出一個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裏的依賴都會自動引入,並默認被全部的子項目繼承。
在使用IDEA開發時,如何將Maven配置呢?
打開IDEA,在File--->Settings。輸入欄搜索:maven
配置咱們以前安裝好的maven目錄、maven下面的setting.xml以及本地倉庫目錄。而後Apply--->OK。
咱們項目對某個項目進行clean 等操做的時候,就能夠直接雙擊Lifcycle下面的。
這樣咱們就把Maven集成到咱們的IDEA中來了。
咱們能夠在父項目中對全部子項目進行編譯、打包等。咱們就來對全部子模塊進行打包。
而後在對應子項目中能夠找到target目錄和對應的jar包。
也可單獨對某個子項目進行打包等操做。好比咱們對user-common進行clean。
因而,此時的user-common下的target已經被刪掉,其餘子項目中並無收到影響。
先建立一個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的方式很輕鬆就能夠建立了。在父項目中使用來管理子模塊的依賴相關依賴。
對大項目進行重構時,只須要把各模塊拆分出來的代碼拷貝到對應子模塊就能夠了。
「沒有天生的信心,只有不斷培養的信心。」