實戰 | 使用maven 輕鬆重構專案

海子002發表於2021-01-27

user-system拆分成:

 

user-web

 

 

user-service

 

 

user-dao

 

 

user-common

 

我們對其拆分後很有可能存在多個子專案中同時依賴某個jar包,如果使用不當可能會導致每個模組使用的版本不一樣,所以想想能不能有什麼方式來解決這類問題呢?

答案:能。但是得先了解兩個概念:聚合和繼承。

聚合

所謂的聚合就是我們如果想一次性構建多個專案模組,那我們就需要把這些專案模組進行聚合。

配置模板

<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="         xmlns:xsi="         xsi:schemaLocation="    <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目錄刪掉,建立子專案:

來到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的方式很輕鬆就可以建立了。在父專案中使用來管理子模組的依賴相關依賴。

對大專案進行重構時,只需要把各模組拆分出來的程式碼複製到對應子模組就可以了。

「沒有天生的信心,只有不斷培養的信心。」


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990085/viewspace-2753939/,如需轉載,請註明出處,否則將追究法律責任。

相關文章