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