SSM 纯注解版采用 Maven 拆分模块进行开发管理

前面已经发布了一篇 SSM 纯注解版整合的技术博客,其 Demo 是作为一个整体模块进行开发管理的,这种开发管理方式仅仅适合一些小型项目。在实际的企业级项目的开发中,由于参与的开发人员较多,业务功能范围庞大、业务调用关系复杂等原因,就得需要对项目进行架构设计、模块拆分、协作开发。

本篇博客制作的 Demo ,是基于上一篇 SSM 博客 Demo ,使用 maven 进行模块拆分,演示如何使用一个父模块对其它子模块进行统一管理,包括聚合、继承、自定义属性、多环境配置打包等 maven 技术。在本篇博客的最后会提供源代码下载。


一、聚合管理

我们使用 maven 创建了一个模块 ssm_root 作为父模块,在 ssm_root 下创建了 4 个子模块,对整体项目进行了模块拆分:

image

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



posted @ 2022-05-27 15:43  乔京飞  阅读(10189)  评论(0编辑  收藏  举报