1.前言
为了更好地组织和管理项目代码。通过将一个大型项目分解成多个模块,每个模块都可以独立地编译、测试和部署,从而提高项目的可维护性和可扩展性。多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。
构建微服务项目,基本上会对模块进行明确的划分,比如:
- 抽象定义公共代码及工具类封装进行引用
- 业务代码进行单独定义模块
- 对外提供的接口服务单独定义模块
- 不同功能系统不同模块
- ......
上面的拆分也并非绝对,随着架构师对于项目结构的不同理解,可能会衍生出不同的模块
本篇文章会详细演示如何创建 SpringBoot 父子模块的项目,针对部分知识点着重讲解
2. 软硬件环境
电脑: win10
创建项目工具: IDEA 2022.3
JDK 版本:JDK8
Maven版本: 3.6.1
3.项目搭建
3.1.创建 SpringBoot 父项目
1)首先打开 IDEA 工具,创建spring项目 ,点击File ---->new ---> Create New Project
2)选择 Spring Initializr(初始化),选择Project SDK 1.8,类型选择maven,Java语言选择8
Group: 项目组织唯一的标识符,实际对应 Java 的包的结构,是 main 目录里 Java 的目录结构Group 也就是 groupId,分为多个段;一般情况下 第一段为域,第二段为公司,第三段为项目名称。以 Nacos 源码进行举例,Group 为 com.alibaba.nacos:com 为商业组织,alibaba 为公司名称,nacos 就是项目名称
Artifact: 项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称,Artifact 即为 artifactId。
Type: 分为四种不同的类型,日常我们选择默认第一条就行,也就是 Maven Project
Language: 开发语言的话自然就是默认的 Java
Packaging: 打包方式,分为 War 包 和 Jar 包,这里选择 Jar 包
Java Version: 选择 Java 的一个版本,再坚持 20 年的 JDK 1.8
Version: 当前项目的一个版本,SNAPSHOT 为快照的意思
开发时一般使用此类型,因为对于 Maven 仓库的同步较为友好,有不同纬度的同步选择
Name: 定义项目名称
Description: 定义项目描述信息,帮助别人更好的了解项目
Package: 定义 main.java 目录下的结构
3)选择 SpringBoot 版本信息以及 Pom.xml 文件依赖组件
这里选择的 SpringBoot 版本是 2.7.1,jdk8对应2.*版本,点击 Next 继续进行创建项目
4)一个标准的 SpringBoot 项目就产生了
3.2. 构建子项目centerdao
在父项目的基础上直接创建module
1)点击菜单栏中 File -> New -> Module,不同版本中可能会有一点差异
** 2)**这里就是重复上述在创建 SpringBoot 项目时的步骤,Next 下一步
3)配置可按照需求进行选择,因为不同的 Module 需要引用不同的 Pom 依赖,后面会与 Parent 保持一个交互,确认创建信息,点击 Finish 生成项目
4)最终结构目录如下,项目已成功创建,后续我们要修改其中的 Pom.xml 使其成为真正的父子项目
3.3. 构建子项目centerweb
1)创建步骤与上边的centerdao一致
** 2)**添加spring web依赖,web项目作为整个项目的启动项目,继续添加代码简化依赖lombok
**3)最终项目结构如下 **
4. 建立父子 Module 依赖
将建立的 Parent 项目与后面创建的 Module 产生关联,需要改动以下几点
- 修改 Parent 项目 Pom.xml 的打包方式 packaging 标签打包方式为 pom
- 删除不必要文件并梳理 Pom.xml 依赖上下级关系
- 需要新加一个 modules 标签,包含所有子项目,将所有的子模块都引入进去
对于子工程中的 .xml 文件
- 修改子项目Module 项目 pom.xml中parent 标签为其父工程
- 添加打包方式为 jar
- 删除依赖包:继承父工程的依赖包
4.1 删除不必要文件
1)删除父项目红框标注的内容:src 文件是保存源代码的,可是我们的多模块的代码存放在多个架构层中,所以不需要这个 src 来存放代码
2)删除除启动项目centerweb之外的启动文件和配置文件和启动类
删除后的项目结构是这样的:
4.2.修改 Parent 项目 packaging
打开 Parent 项目的根 Pom.xml 文件,新增下方代码
<!--打包方式-->
<packaging>pom</packaging>
<modules>
<!-- 配置子项目-->
<!-- 对应artifactId-->
<module>centerdao</module>
<module>centerweb</module>
</modules>
packaging 包含三个值 Jar、War、Pom,默认 Jar的方式
首先来解释下 packaging 为 Pom 的意思,宏观而言即没有代码需要测试或者编译,也没有资源需要处理
Jar: 内部调用或作为服务进行发布使用
War: 需要部署的项目
Pom: 寓意为一个父级项目,一般作为项目聚合和依赖传递使用
modules 代表了 Parent 项目下的子 Module,体现了聚合的思想
这里把 父项目Parent 项目的 Pom.xml 配置复制出来,帮助大家后续排查问题
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.11</version>
<relativePath/>
</parent>
<groupId>com.ykx.center</groupId>
<artifactId>centerparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>centerparent</name>
<description>SpringBoot 父子模块项目</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!--打包方式-->
<packaging>pom</packaging>
<modules>
<!-- 配置子项目-->
<!-- 对应artifactId-->
<module>centerdao</module>
<module>centerweb</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring-boot-maven-plugin 的作用是运行 mvn package 时会将项目打包为可运行的 jar 包,java -jar 运行即可
如果不加这个 plugins,java -jar xxx.jar 会报出如下错误
xxx/target/bootdemo-remote-api-0.0.1-SNAPSHOT.jar中没有主清单属性
4.3.修改子项目pom.xml 信息
创建后的子项目的 Parent 信息是 SpringBoot 配置,修改后如下
<parent>
<groupId>com.ykx.center</groupId>
<artifactId>centerparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
4.4.补充说明
另外说一下 dependencies 和 dependencyManagement 标签做一个讲解
1)dependencies
如果 Parent 项目中使用 **dependencies** 标签,标签内的依赖默认传递子 Module,不用子 Module 进行显示书写依赖
2)dependencyManagement
** dependencyManagement** 与dependencies 不同的是,标签内的依赖不会默认传递子 Module,其作用只是为了统一版本声明
如果子 Module 依赖 Parent 项目中 **dependencyManagement** 标签内的 pom 依赖,需要显示在子 Module 的 pom 文件中进行书写
5. 项目继承关系
我们按照《构建子 Module》章节的内容,构建出如下所述的子 Module,如果centerweb项目引用centerdao项目
<!--引用dao项目-->
<dependency>
<groupId>com.ykx</groupId>
<artifactId>centerdao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
然后修改centenweb子 Module 的 pom.xml 文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ykx.center</groupId>
<artifactId>centerparent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.centerweb</groupId>
<artifactId>centerweb</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>centerweb</name>
<description>centerweb子项目</description>
<properties>
<java.version>1.8</java.version>
<centerdao.version>0.0.1-SNAPSHOT</centerdao.version>
</properties>
<dependencies>
<!--引用dao项目-->
<dependency>
<groupId>com.ykx</groupId>
<artifactId>centerdao</artifactId>
<version>${centerdao.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
通过继承关系的设置,centerdao 中的代码就可以被 centerweb 项目进行引用
6. 验证项目
在 Parent 项目 pom.xml中 dependencies 标签中定义了 spring-boot-starter-web 依赖,直接使用 web 相关内容即可,直接可以运行
在centerweb中创建 Controller 控制器
@RestController
public class DemoController {
@RequestMapping("/ok")
public String test() {
return "OK";
}
}
启动项目
启动后端项目成功后,使用restfultool请求接口
7.异常处理
如果遇到项目搭建后,模块项目无启动类的情况,参考:
https://www.somode.com/softjc/43094.html
8.结语
由于作者水平有限, 希望大家能够反馈指正文章中错误不正确的地方, 感谢 🙏
小伙伴的喜欢就是对我最大的支持 😆 , 希望大家能够 点赞、评论、在看三连
鸣谢
[1].https://blog.csdn.net/qq_37781649/article/details/109321248
版权归原作者 月半花开 所有, 如有侵权,请联系我们删除。