什么是多模块管理
多模块管理简单地理解就是一个 Java 工程项目中不止有一个 pom.xml 文件,会在不同的目录中有多个这样的文件,进而实现 Maven 的多模块管理
为什么要使用多模块管理
随着业务的增长,代码会出现以下问题:
- 不同业务之间的代码互相耦合,难以区分且快速定位问题
- 增加开发成本,入手难度增高
- 开发界线模糊,不易定位到具体负责人
- 对于有特殊需求的模块无法拆解,比如:上传 maven 仓库只需要部分代码即可,但由于只有 1 个模块,不得不全部上传
故而拆分模块之后,可以避免上述问题
模块拆分方案
通常拆分有 2 种方案
按照结构拆分
1 | 复制代码- project |
按照业务拆分
1 | 复制代码- project |
实际项目结构
以一个普通 Spring Boot 项目为例,首先放一张图,看一下整体项目完成后的结构
其中目录结构为
1 | 复制代码- detail-page |
- detail-client 用于放需要打包传到 maven 库的代码
- detail-service 用于放置主要的业务逻辑代码
- detail-start 用于放启动代码
其中需要注意的是 pom.xml 的文件的配置,该配置决定了父子模块之间的关系
1、detail-page 的 pom.xml
1 | 复制代码<?xml version="1.0" encoding="UTF-8"?> |
2、detail-start 的 pom.xml
1 | 复制代码<?xml version="1.0" encoding="UTF-8"?> |
3、detail-service 的 pom.xml
1 | 复制代码<?xml version="1.0" encoding="UTF-8"?> |
4、detail-start 的 pom.xml
因为 detail-start 没有任何依赖所以比较简单
1 | 复制代码<?xml version="1.0" encoding="UTF-8"?> |
通过上述文件我们可以分析出以下关系:
1 | 复制代码- detail-page:父模块 |
注意:在依赖引用过程中,千万不可以出现循环依赖,比如 client 引用了 service,service 也引用了 client,如果出现这种情况 maven 在打包的时候会直接报错
其中建议除了各个子模块单独使用的包之外,其他的都要在父模块下的 pom.xml 中配置包信息,这样便于包的版本控制
项目内部存在了包的依赖之后,不同模块之间的代码即可进行使用,比如 detail-service 依赖 detail-client,那么 detail-client 中的 Test2 就可以被 detail-service 使用了
但是反过来 detail-client 不可以使用 detail-service 中的类,因为依赖是单向的关系
如何启动
启动指令如下
1 | 复制代码$ mvn clean install && mvn spring-boot:run -pl detail-start |
其中 spring-boot:run 可以使用就是因为 spring-boot-maven-plugin 的存在
-pl detail-start 则代表的是有 application 启动类的子模块目录
参考代码
https://github.com/guanpengchn/detail-page/tree/demo1
本文使用 mdnice 排版
本文转载自: 掘金