Spring Boot多模块项目的创建和配置(Maven工程多模块)

简介: Spring Boot多模块项目的创建和配置(Maven工程多模块)

在进行分布式系统开发时,我们通常会创建多个模块的工程项目。即每一个功能就是一个Spring Boot工程,作为一个个模块,然后这些模块都会有一个父模块,父模块通常没有代码只有一个pom.xml

今天就来分享一下Spring Boot如何创建一个多模块项目,以创建一个两个子模块的工程为例。

1,创建父模块

在IDEA中,创建一个Spring Boot项目,但是不勾选任何依赖:

网络异常,图片无法展示
|

网络异常,图片无法展示
|

创建好之后,将父模块中除了pom.xml文件之外的全部文件删除:

网络异常,图片无法展示
|

因为父模块只是做一个模块和依赖管理的作用,因此不需要代码。

然后修改这个父模块的pom.xml文件,首先把节点、节点和全部删除:

网络异常,图片无法展示
|

然后修改版本号为自己定义的(方便后续子模块指定父模块):

网络异常,图片无法展示
|

然后修改父模块打包方式为pom,在其中加入如下语句即可:

<packaging>pom</packaging>

网络异常,图片无法展示
|

好的,到这里父模块修改就完成了!

2,创建子模块

在左边项目树中父模块位置右键新建Spring Boot工程:

网络异常,图片无法展示
|

网络异常,图片无法展示
|

网络异常,图片无法展示
|

然后把子模块不需要的文件也删掉(只留pom.xmlsrc文件夹):

网络异常,图片无法展示
|

修改该子模块的pom.xml文件,首先把子模块中的工件坐标改成和上述父模块一致:

网络异常,图片无法展示
|

网络异常,图片无法展示
|

然后删除子模块的groupId节点,因为通常子模块继承父模块,子模块的组id是和父模块的一致的:

网络异常,图片无法展示
|

ok,到此子模块创建并配置完成!此时这个子模块(工件名module-one)就继承了刚刚的父模块。

然后以这个步骤再创建一个子模块module-two

网络异常,图片无法展示
|

最后整个工程就创建完成了!总共两个子模块。

3,在父模块中指定子模块

回到父模块的pom.xml文件,添加modules节点,在其中加入module节点以指定子模块:

网络异常,图片无法展示
|

需要注意的是,module节点中的内容是子模块工程的文件夹名!所以通常规范起见子模块工程的文件夹名通常和它的组件名一致。

网络异常,图片无法展示
|

然后在父模块文件夹中执行mvn clean package试试:

网络异常,图片无法展示
|

可以看见构建打包成功,以及每个模块的构建时间。

到此,多模块项目就创建完成了!

4,子模块之间的互相引用

在多模块项目中,子模块的互相引用也很方便。

比如说上述module-one要调用module-two中的类,就直接把module-two的工件坐标加入到module-onepom.xml的依赖部分即可!

网络异常,图片无法展示
|

更新一下Maven工程,就可以在module-one中调用module-two的类了!

不过这个时候运行工程是没有任何问题的,但是打包会出错:虽然module-one依赖了module-two,但是仍然会在打包module-one的时候,提示找不到module-two中的类。

网络异常,图片无法展示
|

这是由于Spring Boot打包的模式问题,我们打开被依赖模块module-twopom.xml文件找到最下面节点中,在spring-boot-maven-plugin插件部分中加入下面配置:

<classifier>exec</classifier>

最终如下:

网络异常,图片无法展示
|

这个时候对父模块打包,就成功了!

网络异常,图片无法展示
|

5,依赖管理

多模块项目中模块变多了,依赖管理不当也会导致很多莫名其妙的问题。但是如果对每个模块分别管理依赖及其版本,会相当麻烦。

(1) 共用的依赖

假设上述module-onemodule-two都需要依赖fastjson2,我们平常并不会依次在module-onemodule-two中分别单独加入其依赖,而是直接在父模块pom.xml中指定,和平时一样,在父模块的pom.xmldependencis节点中加入即可:

网络异常,图片无法展示
|

这样,子模块中即使是不加入fastjson2依赖,也可以使用这个库了!因为子模块除了可以使用自己的依赖之外,还会向上查找父模块的依赖,也就是说,父模块的依赖是向下继承的,因此对于所有模块都要使用的依赖,我们可以写在父模块中。

所以,两个模块都依赖于Spring Web话,也可以将两个模块的Spring Web依赖移至父模块。

所以说父模块和子模块中,依赖也有着继承的关系!事实上,父模块的properties也是向下继承的。

(2) 依赖版本管理

假如现在module-one依赖于okhttps4.0.0版本,而module-two依赖于commons-io2.11.0版本,显然这时我们不适合再在父模块中加入了,还是各自加入对应依赖。

网络异常,图片无法展示
|

目前因为只有两个模块,这么做看起来很合理。但是假设现在又多了module-threemodule-four等等,它们也是分别依赖于okhttpscommons-io,那么我们又要分别在这两个模块中分别单独加入依赖。

摸块 依赖
module-onemodule-three okhttps
module-twomodule-four commons-io

可能一开始没有问题,但是后面模块依赖版本需要更新,但是一个个地更新难免会有疏漏,导致部分模块虽然依赖一样但是版本不一致,最后整个系统也出现了莫名其妙地错误,还难以排查。

就假设后面你把module-oneokhttps更新到了4.0.1版本,但是module-threeokhttps仍然是4.0.0版本,这样整个系统就可能出现问题甚至无法启动。

尤其是模块变成十几个甚至上百个了,一个个地手动修改是几乎不可能的,要如何让每个模块使用的依赖版本统一呢?

这时,我们就要借助dependencyManagement标签了!

dependencyManagement用于管理依赖的版本,我们在父模块的pom.xml加入这个标签:

<dependencyManagement><dependencies><dependency><groupId>cn.zhxu</groupId><artifactId>okhttps</artifactId><version>4.0.0</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency></dependencies></dependencyManagement>

然后,在子模块中,就可以把对应的依赖版本去掉了!

网络异常,图片无法展示
|

可见这里,子模块中只需要引入对应依赖,而不需要指定版本了!因为子模块会向上查找父模块中dependencyManagement标签中对应依赖的版本

这样,就起到了统一管理版本的作用,只需要在父模块的dependencyManagement中修改对应依赖版本,子模块中对应依赖都会相应地使用这个版本。

dependencyManagement的注意事项:

  • dependencyManagement仅用于管理版本,而不会为自己以及子模块导入依赖,因此在dependencyManagement中声明依赖后,对应的子模块仍然需要在dependencies中加入依赖
  • pom.xmldependencyManagementdependencies同级,并且dependencyManagement中也需要有一个dependencies
  • dependencyManagement不仅可以管理子模块的依赖版本,也可以管理自身的依赖版本
  • 若不想让某个子模块使用父模块dependencyManagement的版本,那就在这个子模块的dependencies中声明对应版本

(3) 总结

总而言之,对于所有子模块都共用的依赖,我们只需在父模块的dependencies中引入这个依赖即可,而不需要再在子模块pom.xml中引入。

而对于不是所有子模块都需要的依赖,而是部分子模块需要的,又要统一版本管理,这时除了在需要这个依赖的子模块中引入依赖之外,还需要在父模块中的dependencyManagement声明这个依赖及其版本,这时,可以去掉子模块中对应依赖的版本号,使其遵循父模块中声明的版本。

示例仓库地址:

相关文章
|
28天前
|
Java Maven
解决idea每次新建maven项目都需要重新配置maven的问题
解决idea每次新建maven项目都需要重新配置maven的问题
67 1
|
5天前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
50 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
6天前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
|
17天前
|
IDE Java 开发工具
还在为繁琐的配置头疼吗?一文教你如何用 Spring Boot 快速启动,让开发效率飙升,从此告别加班——打造你的首个轻量级应用!
【9月更文挑战第2天】Spring Boot 是一款基于 Spring 框架的简化开发工具包,采用“约定优于配置”的原则,帮助开发者快速创建独立的生产级应用程序。本文将指导您完成首个 Spring Boot 项目的搭建过程,包括环境配置、项目初始化、添加依赖、编写控制器及运行应用。首先需确保 JDK 版本不低于 8,并安装支持 Spring Boot 的现代 IDE,如 IntelliJ IDEA 或 Eclipse。
53 5
|
21天前
|
Java 微服务 Spring
Spring Cloud全解析:配置中心之解决configserver单点问题
但是如果该configserver挂掉了,那就无法获取最新的配置了,微服务就出现了configserver的单点问题,那么如何避免configserver单点呢?
|
28天前
|
安全 Java Maven
优化Maven镜像配置:使用阿里云加速依赖下载
更新Maven镜像配置至关重要,尤其使用阿里云仓库时。在`settings.xml`中加入特定镜像配置可显著提升依赖下载速度。示例配置指定了阿里云镜像ID、替代表态仓库、安全的URL、默认布局及启用版本管理。需定位至用户目录下的`.m2/`文件夹编辑`settings.xml`,添加镜像信息后保存测试。若下载仍慢,考虑网络状况或备选镜像。多镜像设置时需注意避免冲突。
124 3
|
19天前
|
Java Spring 开发者
解锁 Spring Boot 自动化配置的黑科技:带你走进一键配置的高效开发新时代,再也不怕繁琐设置!
【8月更文挑战第31天】Spring Boot 的自动化配置机制极大简化了开发流程,使开发者能专注业务逻辑。通过 `@SpringBootApplication` 注解组合,特别是 `@EnableAutoConfiguration`,Spring Boot 可自动激活所需配置。例如,添加 JPA 依赖后,只需在 `application.properties` 配置数据库信息,即可自动完成 JPA 和数据源设置。这一机制基于多种条件注解(如 `@ConditionalOnClass`)实现智能配置。深入理解该机制有助于提升开发效率并更好地解决问题。
33 0
|
19天前
|
Java Spring 开发者
Spring 框架配置属性绑定大比拼:@Value 与 @ConfigurationProperties,谁才是真正的王者?
【8月更文挑战第31天】Spring 框架提供 `@Value` 和 `@ConfigurationProperties` 两种配置属性绑定方式。`@Value` 简单直接,适用于简单场景,但处理复杂配置时略显不足。`@ConfigurationProperties` 则以类级别绑定配置,简化代码并更好组织配置信息。本文通过示例对比两者特点,帮助开发者根据具体需求选择合适的绑定方式,实现高效且易维护的配置管理。
29 0
|
21天前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
27 0
|
26天前
|
Java 测试技术 数据库
SpringBoot单元测试快速写法问题之不想在PandoraBoot工程中Mock Dao层如何解决
SpringBoot单元测试快速写法问题之不想在PandoraBoot工程中Mock Dao层如何解决