1. 程式人生 > 其它 >SSM 純註解版採用 Maven 拆分模組進行開發管理

SSM 純註解版採用 Maven 拆分模組進行開發管理

前面已經發布了一篇 SSM 純註解版整合的技術部落格,其 Demo 是作為一個整體模組進行開發管理的,這種開發管理方式僅僅適合一些小型專案。在實際的企業級專案的開發中,由於參與的開發人員較多,業務功能範圍龐大、業務呼叫關係複雜等原因,就得需要對專案進行架構設計、模組拆分、協作開發。

本篇部落格製作的 Demo ,是基於上一篇 SSM 部落格 Demo ,使用 maven 進行模組拆分,演示如何使用一個父模組對其它子模組進行統一管理,包括聚合、繼承、自定義屬性、多環境配置打包等 maven 技術。在本篇部落格的最後會提供原始碼下載。


一、聚合管理

我們使用 maven 建立了一個模組 ssm_root 作為父模組,在 ssm_root 下建立了 4 個子模組,對整體專案進行了模組拆分:

ssm_root 作為父模組,本身不需要編寫任何程式碼,因此只需要保留一個 pom.xml 檔案即可。

ssm_root 作為父模組,要想管理其它 4 個子模組,只需要在 pom.xml 檔案中增加以下配置即可:

<modules>
    <module>ssm_domain</module>
    <module>ssm_dao</module>
    <module>ssm_service</module>
    <module>ssm_controller</module>
</modules>

在 4 個子模組中的 pom.xml 檔案中,增加以下配置即可:

<parent>
    <artifactId>ssm_root</artifactId>
    <groupId>com.jobs</groupId>
    <version>1.0-SNAPSHOT</version>
    <!--指定父模組的 pom 檔案的位置,如果當前模組在父模組目錄下,可以省略該配置-->
    <relativePath>../pom.xml</relativePath>
</parent>

上面列出的這些配置,在使用 IDEA 進行父模組和子模組的建立過程中,會自動生成,不需要手工新增。

在完成了以上配置之後,在 IDEA 的右側執行 ssm_root 這個父模組的 maven 生命週期下的命令即可實現所有子模組的相應 maven 命令的執行,實現統一編譯和打包,這樣就實現的聚合管理。


二、繼承管理

繼承管理主要是指 jar 包的版本繼承,在 ssm_root 父模組的 pom 檔案中匯入專案所需要使用的所有 jar 包幷包含 jar 包具體的版本,然後在其他 4 個子模組的 pom.xml 檔案中,需要什麼 jar 包,就匯入什麼 jar 包,可以省略 jar 包版本,其預設使用 ssm_root 父模組中相應 jar 包的版本,這樣便做到了 jar 包版本的統一管理。如果子模組確實需要跟父模組的某些 jar 包版本不一致時,在子模組匯入的 jar 包中可以指定具體的版本。

關於繼承管理,比較簡單,這裡就不列出具體細節了,請在本部落格最後下載原始碼,詳細內容檢視原始碼。


三、自定義屬性

為了方便在 ssm_root 父模組中,進行相關 jar 包的版本統一管理,如對 spring 的核心 jar 版本,spring mvc 的 jar 包版本,spring jdbc 的 jar 包版本等進行統一的版本管理,可以在自定義屬性中進行版本號的定義,然後通過 ${自定義屬性} 給相關的 jar 版本進行賦值,如下所示:

<!--在 ssm_root 父模組的 pom 檔案中定義自定義屬性-->
<properties>
    <!--定義名稱為 spring.version 的自定義屬性,統一維護 spring 相關 jar 包版本-->
    <spring.version>5.3.18</spring.version>
</properties>

<!--在父模組中,使用 dependencyManagement 進行 jar 包統一管理-->
<dependencyManagement>
    <!--採用 ${spring.version} 統一設定 spring 相關 jar 包的版本-->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在本篇部落格的 demo 中,由於 mysql 是 dao 模組進行操作,所以有關 mysql 的連線資訊配置檔案 jdbc.properties 放到了 ssm_dao 模組的 resources 目錄下;由於 redis 是 service 層操作的,所以有關 redis 的連線資訊配置檔案 redis.properties 放到了 ssm_service 模組的 resources 目錄下。這些配置檔案放置的位置比較分散。

為了方便統一管理這些變化比較頻繁的配置資訊,在不進行多環境配置(下面會介紹多環境配置)的前提下,我們可以在父模組 ssm_root 的 pom 檔案中的自定義屬性中配置,然後在各個子模組的 resources 目錄下的配置檔案中,通過 ${自定義屬性} 進行使用。具體細節如下:

1 首先在父模組 ssm_root 的自定義屬性中,定義自定義屬性並賦值

<properties>
    <!--如果沒有使用多環境配置時,
        可以在自定義屬性中,定義平時修改比較頻繁的配置項,
        這樣可以在父模組的 pom 檔案中進行統一配置資訊管理,
        比如本 demo 的 mysql 和 redis 的配置-->

    <!--在父模組的屬性中,配置 MySql 資料庫連線資訊-->
    <db.url>jdbc:mysql://localhost:3306/testdb?useSSL=false</db.url>
    <db.username>root</db.username>
    <db.password>123456</db.password>
    <pool.initialSize>3</pool.initialSize>
    <pool.maxActive>20</pool.maxActive>
    <pool.maxWait>3000</pool.maxWait>

    <!--在父模組的屬性中,配置 Redis 連線資訊-->
    <redis.host>localhost</redis.host>
    <redis.port>6379</redis.port>
    <redis.maxActive>10</redis.maxActive>
    <redis.maxIdle>5</redis.maxIdle>
    <redis.minIdle>1</redis.minIdle>
    <redis.maxWait>3000</redis.maxWait>
</properties>

2 在父模組 ssm_root 的 build 下的 resources 下配置資原始檔所在的目錄,一般配置為各個模組下的 resources 目錄

<build>
    <resources>
        <resource>
            <!--配置資原始檔所在的目錄,
                目錄下的資原始檔可以通過 ${自定義屬性名} 來引用父模組 pom 檔案中的自定義屬性配置值,
                ${project.basedir} 表示所有模組的工程根目錄,
                本專案有 4 個模組:ssm_domain,ssm_dao,ssm_service,ssm_controller,
                所以下面的配置,代表這 4 個模組的 resources 目錄路徑
                -->
            <directory>${project.basedir}/src/main/resources</directory>
            <!--啟用對所配置的資源目錄中下所有資原始檔的管理功能,
                這樣資原始檔中就可以通過 ${自定義屬性名} 來引用父模組 pom 檔案中的自定義屬性配置值-->
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

3 在子模組的 resources 目錄下的具體資原始檔中,通過 ${自定義屬性} 來使用

# 在 ssm_dao 模組下的 jdbc.properties 檔案
# 採用父模組的 pom 檔案管理 mysql 連線資訊的配置
# 從父模組的 pom 檔案的自定義屬性中讀取配置資訊

mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=${db.url}
mysql.username=${db.username}
mysql.password=${db.password}

# 初始化連線的數量
druid.initialSize=${pool.initialSize}
# 最大連線的數量
druid.maxActive=${pool.maxActive}
# 獲取連線的最大等待時間(毫秒)
druid.maxWait=${pool.maxWait}
# 在 ssm_service 模組下的 redis.properties 檔案
# 採用父模組的 pom 檔案管理 redis 連線資訊的配置
# 從父模組的 pom 檔案的自定義屬性中讀取配置資訊

redis.host=${redis.host}
redis.port=${redis.port}

# 如果你的 redis 設定了密碼的話,可以使用密碼配置
# redis.password=123456

redis.maxActive=${redis.maxActive}
redis.maxIdle=${redis.maxIdle}
redis.minIdle=${redis.minIdle}
redis.maxWait=${redis.maxWait}

通過以上配置,即可實現在父模組 ssm_root 的 pom 檔案中,通過自定義屬性來管理 mysql 和 redis 的連線資訊,在需要修改的時候,只需要修改 ssm_root 這一個 pom 檔案即可,不需要到各個子模組中去找那些分散的配置檔案。


四、多環境配置

我們在實際專案的開發過程中,肯定會遇到這樣的問題,那就是:開發環境、測試環境、生產環境的 mysql 和 redis 等相關連線配置資訊不一樣,在釋出版本時,得不斷的去修改這些配置資訊,然後進行打包釋出,實在是太麻煩了。此時就可以使用 maven 提供的多環境配置,來解決這個問題。

我們可以在父模組 ssm_root 的 pom 檔案下的 profiles 下進行 多環境配置 和 自定義屬性 配置,通過在具體的環境 profile 下增加 activation 配置,來表示當我們點選 IDEA 右側的 maven 生命週期命令時,預設採用的是哪種環境下的配置。

<!--為了方便不同環境下,使用不同的配置,所以定義環境並編寫配置-->
<profiles>
    <!--定義開發環境-->
    <profile>
        <!--在 maven 中執行 install -P mydevelop 命令,即可生成和安裝開發環境的包-->
        <id>mydevelop</id>
        <!--定義開發環境的自定義屬性,配置 mysql 和 reids 的配置資訊-->
        <properties>
            <!--在父模組的屬性中,配置 MySql 資料庫連線資訊-->
            <db.url>jdbc:mysql://127.0.0.1:3306/testdb?useSSL=false</db.url>
            <db.username>root</db.username>
            <db.password>123456</db.password>
            <pool.initialSize>3</pool.initialSize>
            <pool.maxActive>20</pool.maxActive>
            <pool.maxWait>3000</pool.maxWait>

            <!--在父模組的屬性中,配置 Redis 連線資訊-->
            <redis.host>127.0.0.1</redis.host>
            <redis.port>6379</redis.port>
            <redis.maxActive>10</redis.maxActive>
            <redis.maxIdle>5</redis.maxIdle>
            <redis.minIdle>1</redis.minIdle>
            <redis.maxWait>3000</redis.maxWait>
        </properties>

        <!--使用該項配置,可以配置點選右側 maven 的 install 命令時,預設使用的環境
            因為該專案配置是在開發環境中配置的,因此預設使用開發環境的配置
            -->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>

    <!--測試環境-->
    <profile>
        <!--在 maven 中執行 install -P mytest 命令,即可生成和安裝測試環境的包-->
        <id>mytest</id>
        <properties>
            <!--在父模組的屬性中,配置 MySql 資料庫連線資訊-->
            <db.url>jdbc:mysql://localhost:3306/testdb?useSSL=false</db.url>
            <db.username>root</db.username>
            <db.password>123456</db.password>
            <pool.initialSize>3</pool.initialSize>
            <pool.maxActive>20</pool.maxActive>
            <pool.maxWait>3000</pool.maxWait>

            <!--在父模組的屬性中,配置 Redis 連線資訊-->
            <redis.host>localhost</redis.host>
            <redis.port>6379</redis.port>
            <redis.maxActive>10</redis.maxActive>
            <redis.maxIdle>5</redis.maxIdle>
            <redis.minIdle>1</redis.minIdle>
            <redis.maxWait>3000</redis.maxWait>
        </properties>
    </profile>
</profiles>

如上所示:本部落格 Demo 中定義了兩種環境:開發環境 和 測試環境。開發環境 和 測試環境 都有屬於自己的自定義屬性配置,這裡也以配置 mysql 和 redis 的連線資訊為例,為了在打包時能夠區分,開發環境中配置的連線字串是的伺服器地址是 127.0.0.1 ,測試環境中配置的是 localhost。當我們進行修復 bug 時,可以採用開發環境的配置進行打包開發除錯;當我們修復完 bug 時,可以使用測試環境的配置進行打包,然後把 war 包發給測試組即可。

為了能夠看到效果,程式打包後,需要到具體的 jar 包檢視配置資訊。比如我們使用開發環境打包完成後,需要到 ssm_dao-1.0-SNAPSHOT.jar 中檢視 jdbc.properties 檔案內容,以及到 ssm_service-1.0-SNAPSHOT.jar 中檢視 redis.properties 檔案內容,檢查連線配置資訊是否與開發環境中的配置一致。


五、子模組拆分

有關子模組的拆分,請下載本部落格 Demo 的原始碼進行檢視。

遵循的拆分規則就是:相關配置屬於哪一層,就拆分到哪一層。因此有關 spring 的配置檔案會被拆分成兩個:SpringConfigDao 和 SpringConfigService。在實際使用 Spring 配置的地方,需要載入這兩個類即可。比如在 ssm_service 的單元測試中,以及在 ssm_controller 的 ServletInitConfig 類中,就載入了這兩個檔案。



到此為止,有關使用 maven 對之前的 ssm 純註解版 demo 進行模組拆分管理的重要知識點,已經介紹完畢。

本部落格的原始碼下載地址為:https://files.cnblogs.com/files/blogs/699532/ssm_split_demo.zip