實戰 | 使用maven 輕鬆重構項目

如今是微服務盛行時代,說不許哪一天領導就會讓你對一個大項目進行重構。大項目的痛點:編譯慢、發佈繁瑣等。就像下面這張圖:web

 

img

 

真的不敢動呀,一不當心就坍塌了。面試

好比說咱們用戶系統,咱們能夠這麼重構(這裏只是舉例,每一個項目拆分目的可能不一樣)。apache

user-system拆分紅:maven

  • user-web微服務

  • user-service測試

  • user-daoui

  • user-commonspa

咱們對其拆分後頗有可能存在多個子項目中同時依賴某個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>

這樣的好處是子模塊能夠有選擇性的繼承,而不須要所有繼承。

 

img

 

這樣作的好處:統一管理項目的版本號,確保應用的各個項目的依賴和版本一致,才能保證測試的和發佈的是相同的成果,所以,在頂層pom中定義共同的依賴關係。同時能夠避免在每一個使用的子項目中都聲明一個版本號,這樣想升級或者切換到另外一個版本時,只須要在父類容器裏更新,不須要任何一個子項目的修改;若是某個子項目須要另一個版本號時,只須要在dependencies中聲明一個版本號便可。子類就會使用子類聲明的版本號,不繼承於父類版本號。

聚合和繼承的關係

在前面咱們構建多模塊項目中,關係以下

 

img

 

mavendemo就是user-web、user-service等幾個模塊的父項目。

父項目主要是用來配置一些公共的配置,其它三個項目再經過繼承的方式擁有父項目中的配置,首先配置父項目的pom.xml,添加對項目的user-webuser-serviceuser-daouser-common這四個模塊進行聚合以及jar包依賴。

相對於dependencyManagement,全部生命在dependencies裏的依賴都會自動引入,並默認被全部的子項目繼承。

面試題:dependencyManagement和dependencies的區別

  • dependencyManagement裏只是聲明依賴,並不實現引入,所以子項目須要顯示的聲明須要用的依賴。若是不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,而且沒有指定具體版本,纔會從父項目中繼承該項,而且version和scope都讀取自父pom;另外若是子項目中指定了版本號,那麼會使用子項目中指定的jar版本。

  • dependencies即便在子項目中不寫該依賴項,那麼子項目仍然會從父項目中繼承該依賴項(所有繼承)。

IDEA中配置Maven

在使用IDEA開發時,如何將Maven配置呢?

打開IDEA,在File--->Settings。輸入欄搜索:maven

 

img

 

配置咱們以前安裝好的maven目錄、maven下面的setting.xml以及本地倉庫目錄。而後Apply--->OK。

 

img

 

咱們項目對某個項目進行clean 等操做的時候,就能夠直接雙擊Lifcycle下面的。

 

img

 

這樣咱們就把Maven集成到咱們的IDEA中來了。

編譯運行項目

咱們能夠在父項目中對全部子項目進行編譯、打包等。咱們就來對全部子模塊進行打包。

 

img

 

而後在對應子項目中能夠找到target目錄和對應的jar包。

 

img

 

也可單獨對某個子項目進行打包等操做。好比咱們對user-common進行clean。

 

img

 

因而,此時的user-common下的target已經被刪掉,其餘子項目中並無收到影響。

IDEA中如何建立多項目模塊

先建立一個user-parent的maven項目:

 

img

 

而後把src目錄刪掉,建立子項目:

選中user-parent項目,右鍵,選中New-->Module

 

img

 

來到New Module界面,選擇Maven,選好本身的本地安裝的JDK。

 

img

 

next。填寫子項目名稱,咱們這裏建立一個user-web的子項目:

 

img

 

注意這裏user-web,默認是userweb,須要咱們手工在兩個單詞之間添加橫線:

 

img

 

點擊Finish:

 

img

 

而後在看看user-parent的pom中的內容:

 

img

 

已經添加了modules,同時把咱們的user-web添加進去了。

一樣方法,咱們就能夠建立更多字項目了:

 

img

 

再看看user-parent中的pom.xml文件內容:

 

img

 

到這裏,咱們就輕輕鬆鬆的構建了咱們這個大項目user-parent,該項目包括了user-web,user-service,user-dao,-user-commmon子項目。

如果新建多模塊項目,安裝上面的步驟就搞定了。

如果大項目拆分,咱們就可使用上面的方式先建立好本身的多模塊項目,而後對應把大項目裏的內容拷貝到對應模塊中(須要注意此時子模塊直接確定會有相互依賴的)。

總結

經過繼承,咱們能夠定義項目的父類項目,用於繼承父項目的依賴、插件、屬性等信息。聚合就是咱們若是想一次性構建多個項目模塊,那咱們就須要對這些項目模塊進行聚合。

構建多模塊項目,在IDEA中使用建立Module的方式很輕鬆就能夠建立了。在父項目中使用來管理子模塊的依賴相關依賴。

對大項目進行重構時,只須要把各模塊拆分出來的代碼拷貝到對應子模塊就能夠了。

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

相關文章
相關標籤/搜索