What
内含一个或多个maven模块的SpringBoot项目称为SpringBoot多模块项目
Why
-
便于维护
将一个大的单体项目分成多个子模块有利于模块间的维护,
删除或移动单个模块时对其他模块的影响也比较小
单个模块还可以复用 -
共享依赖
只需要在父类中定义公共的依赖项,子类模块都会共享父类的依赖项
在大型项目中会使得代码更容易简洁。
How
1.父模块
创建父项目(SpringBoot)
删除不需要的目录
去除src .mvn mvnw mvnw.cmd 文件
pom
- packaging标签
打包方式改为"pom", 表示这个模块是聚合模块
把子类模块都"聚合"起来
使用maven打包,可以从这个模块开始,会自动计算打包顺序
<packaging>pom</packaging>
- dependencies与dependencyManagement标签
1. dependencies
将依赖放入标签中
子模块会自动引入父类的的依赖
2. dependencyManagement
将依赖放入标签中
子模块不会自动引入父类的的依赖
还需要在子类中声明一次依赖
GAV中不需要声明version标签,version同父类中的一致
父类pom文件demo
<!-- 父类: springboot自带的启动类父类-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 创建时填写的基本信息-->
<groupId>com.ybj</groupId>
<artifactId>my-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>my-app</name>
<description>springboot多项目</description>
<!-- 父类的packing只能是pom-->
<packaging>pom</packaging>
<!-- 子类直接继承-->
<dependencies>
<!-- 子类需要在pom中 手动加入依赖(version不用写)-->
<dependencyManagement>
- modules标签
这个标签管理的是被聚合的模块
当新建子模块时,modules会自动添加单个的module标签
启动类
父模块启动类,是整个模块的启动类
所有的请求都走父模块的端口
为了使子模块的服务也能启动,需要在父模块启动类上加入注解
@ComponentScan(basePackages = {"com.ybj.*",})
2.子模块
1.创建子模块
选择Module
选择maven项目
输入具体信息
2.pom
- packaging标签
这里可以选择jar或者war
指定打包方式 - parent
子类pom中的parent自动指向了父类的GAV
子类会自动引入父类pom中dependencies的中依赖项
<!-- 父类:自动选择了父类-->
<parent>
<artifactId>my-app</artifactId>
<groupId>com.ybj</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
-
模块间依赖
需要依赖某个模块,可以在pom中声明
这里的依赖是从本地仓库下载的,不是远程仓库 -
Maven Helper插件
在idea中安装maven helper插件
点击pom文件,选择 Dependency Analyzer
即可查看并搜索依赖项,这对于解决依赖冲突很有帮助
4.打包
方式1:聚合模块直接打包
在聚合模块打包,会自动计算依赖顺序,依次打包
依次执行 clean 与 install
maven会自动计算构建顺序
方式2:使用插件
方式1的问题就是耗费时间长, 因为是全部打包,
所以就需要实现单个模块打包
这里需要借助spring-boot-maven-plugin插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.0.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
5. 常见问题
依赖冲突
因为子类会继承父类的依赖项,所以可能 导致依赖冲突,从而使项目无法启动。
这里可以使用maven helper插件进行冲突的排查