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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律