当前位置: 首页 > news >正文

如何简洁高效的搭建一个SpringCloud2023的maven工程

前言

依赖管理有gradle和maven,在这里选择比较常用和方便的Maven作为工程项目和依赖管理工具来搭建SpringCloud实战工程。主要用到的maven管理方式是多模块和bom依赖管理。

什么是maven的多模块依赖管理

Maven 多模块项目相对于单模块项目而言,依赖是不共享的,但父模块提供了全局共享依赖的功能,可以针对不同模块所需要依赖的包进行分模块引入。具体如下:

  • 所有子模块都依赖的包,如junit可以统一由父模块中的<dependencies>设置依赖。
  • 多个子模块但非全部子模块依赖的包,可以在父模块中的<dependencyManagement>中统一管理依赖版本,再由每个子模块自主引入依赖,这样设置可以达到项目中多个子模块依赖的包版本统一的目的。
  • 单个子模块依赖的包,可以直接交由这个子模块引入即可。但有时候出于对后续可能添加子模块考虑,即使当前只有一个子模块依赖的包,也可以统一交由父模块的<dependencyManagement>统一管理,而如果确认后续不会再加子模块的,可以按前者进行处理。

在父模块中,可通过<properties>统一管理依赖包的版本,让共享包也更加统一管理。

什么是maven的bom依赖管理

Maven 的 BOM(Bill of Materials)依赖管理是一种用于集中管理项目依赖关系和版本的方式,它提供了一种方便的方法来确保多个项目或模块在使用相同依赖时具有一致的版本。

BOM 通常是一个特殊的 Maven POM(Project Object Model)文件,其中定义了项目所需的依赖项及其版本。通过在其他项目中引用这个 BOM,这些项目将自动获取 BOM 中定义的依赖版本,而无需明确指定每个依赖的版本。

这样做的好处是可以减少重复的依赖配置工作,并确保在多个项目中使用相同的依赖版本,从而减少由于依赖不一致导致的问题。此外,BOM 还可以用于管理依赖的升级和版本控制,只需在 BOM 中更新依赖的版本,所有引用该 BOM 的项目都会自动获取最新的版本。

要使用 Maven 的 BOM 依赖管理,通常需要执行以下步骤:

  • 创建或获取一个 BOM POM 文件,其中定义了项目的依赖和版本信息。
  • 在需要使用 BOM 的项目中,通过在<dependencyManagement>部分引用 BOM POM 文件。
  • 在项目的具体依赖部分,可以直接使用 BOM 中定义的依赖,而无需明确指定版本。

组件选型

在“SpringCloud2023最新版本该如何进行组件选型?”一文中已经具体的介绍了SpringCloud的组件对比和选型,具体可以查看合集里面的相关文档。

  • 注册中心(Spring Cloud Zookeeper):负责服务的注册和发现。
  • 网关(Spring Cloud Gateway):作为外部请求的入口,实现路由和负载均衡。
  • 云服务配置(Spring Cloud Config):用于管理服务的配置信息。
  • 熔断(Sentinel):提供熔断器功能,实现服务的限流和降级。
  • 服务追踪(Micrometer Tracing):用于追踪和监控服务的性能和调用情况。
  • 测试集成(JUnit 5 + Spring Boot Test):用于编写和执行单元测试。
  • 远程调用(OpenFeign):用于服务之间的远程调用。
  • 接口文档(springdoc-openapi + openapi3):用于生成和管理 API 的文档。
  • 分布式事务(Seata):用于处理跨多个服务的事务。

版本选择

在“SpringCloud和SpringBoot的版本依赖该怎么选择”一文中已经具体的介绍了SpringCloud的版本如何选择,具体可以查看合集里面的相关文档。

组件版本
jdk17
spring boot3.2.x
spring cloud2023.0.x
spring cloud alibaba2022.0.0.0(还未更新,但是兼容2023)

为什么选择JDK17

选择JDK17的原因如下:

  • JDK 17是 LTS(长期支持版)。
  • JDK 17性能提升不少。
  • 大多数第三方框架和库都已经支持,不会有什么大坑。
  • JDK 17有更多的新特性支持。

Maven工程依赖说明

|-- banana-client1
|-- banana-client2
|-- banana-client3
|-- banana-client4-sentinel
|-- banana-client5-tracing
|-- banana-client6-test
|-- banana-common
|   |-- banana-common-bom
|   `-- banana-common-core
|-- banana-config
|-- banana-gateway
|-- banana-gateway-sso
`-- banana-seata-example
  • 根目录下的pom.xml负责管理整个项目的版本和依赖引入版本管理,以及子模块的管理。
  • banana-common-bom 负责管理整个公共依赖的版本,比如undertow、swagger的版本。
  • banana-common-core 负责管理整个公共组件的引入,比如 hutool、validation、test等。
  • gateway 相关项目为SCG相关工程。
  • client 相关项目为springboot相关工程。
  • 其他工程会在后续的文章说明。欢迎持续关注。

顶级工程pom.xml配置

该maven的pom文件定义了如下内容:

  • Maven 项目的模块列表
  • Maven 项目的属性列表
  • Maven 项目的依赖管理
  • Maven 项目的仓库列表
  • Maven 项目的构建配置
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- Maven 项目的根节点 --><modelVersion>4.0.0</modelVersion><!-- Maven 项目的groupId,在 Maven 仓库中,groupId 必须是唯一的 --><groupId>io.rainforest</groupId><!-- Maven 项目的 artifactId,可以包含多个模块 --><artifactId>banana</artifactId><!-- Maven 项目的版本号 --><version>1.0</version><!-- Maven 项目的打包方式,这里是 pom --><packaging>pom</packaging><!-- Maven 项目的模块列表 --><modules><module>banana-gateway</module><module>banana-config</module><module>banana-common</module><module>banana-client1</module><module>banana-client2</module><module>banana-client3</module><module>banana-client4-sentinel</module><module>banana-client5-tracing</module><module>banana-client6-test</module><module>banana-seata-example</module><module>banana-gateway-sso</module></modules><!-- Maven 项目的属性列表 --><properties><!-- Maven 编译器的 source 版本 --><maven.compiler.source>17</maven.compiler.source><!-- Maven 编译器的 target 版本 --><maven.compiler.target>17</maven.compiler.target><!-- 项目构建的源编码 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- Spring Boot 的版本 --><spring-boot.version>3.2.3</spring-boot.version><!-- Spring Cloud 的版本 --><spring-cloud.version>2023.0.0</spring-cloud.version><!-- Spring Cloud Alibaba 的版本 --><spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version></properties><!-- Maven 项目的依赖管理 --><dependencyManagement><!-- Maven 项目的依赖列表 --><dependencies><!-- banana 公共版本定义 --><dependency><groupId>io.rainforest</groupId><artifactId>banana-common-bom</artifactId><version>${project.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Boot 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud Alibaba 依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- Maven 项目的仓库列表 --><repositories><!-- Maven 中央仓库的配置 --><repository><id>central</id><name>Central Repository</name><url>https://mirrors.huaweicloud.com/repository/maven/</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository></repositories><!-- Maven 项目的构建配置 --><build><!-- Maven 项目构建的最终名称 --><finalName>${project.name}</finalName><!-- Maven 项目的资源配置 --><resources><!-- 资源文件所在的目录 --><resource><directory>src/main/resources</directory><!-- 对资源文件进行过滤 --><filtering>true</filtering></resource></resources><!-- Maven 项目的插件管理 --><pluginManagement><!-- Maven 项目的插件列表 --><plugins><!-- Spring Boot Maven 插件的配置 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><!-- 项目构建的最终名称 --><finalName>${project.build.finalName}</finalName><!-- 启用 Spring Boot 的分层 --><layers><enabled>true</enabled></layers></configuration><!-- Maven 插件的执行配置 --><executions><!-- Maven 插件的执行目标 --><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></pluginManagement></build>
</project>

工程的公用依赖bom配置

该maven的pom文件定义了如下内容:

  • Maven 项目的属性列表,包含版本等信息
  • Maven 项目使用到的依赖版本管理
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><groupId>io.rainforest</groupId><artifactId>banana-common-bom</artifactId><version>1.0</version><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><description>banana-common-bom 公共依赖管理</description><properties><banana.common.version>${project.version}</banana.common.version><spring-boot.version>3.1.3</spring-boot.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><log4j2.version>2.17.1</log4j2.version><maven.compiler.target>17</maven.compiler.target><maven.compiler.source>17</maven.compiler.source><git.commit.plugin>4.9.9</git.commit.plugin><spring.checkstyle.plugin>0.0.39</spring.checkstyle.plugin><fastjson.version>1.2.83</fastjson.version><springdoc.version>2.1.0</springdoc.version><swagger.core.version>2.2.14</swagger.core.version><mybatis-plus.version>3.5.3.2</mybatis-plus.version><mysql.version>8.0.33</mysql.version><dynamic-ds.version>4.1.3</dynamic-ds.version><seata.version>1.6.1</seata.version><excel.version>3.1.0</excel.version><asm.version>7.1</asm.version><sms.version>3.0.0</sms.version><jaxb.version>2.3.5</jaxb.version><shardingsphere.version>5.4.0</shardingsphere.version><hutool.version>5.8.21</hutool.version><mica.version>3.0.8</mica.version><sentinel.version>1.8.4</sentinel.version></properties><!-- 定义全局jar版本,模块使用需要再次引入但不用写版本号--><dependencyManagement><dependencies><dependency><groupId>io.rainforest</groupId><artifactId>banana-common-core</artifactId><version>${banana.common.version}</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>${mysql.version}</version></dependency><!--springdoc --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webflux-ui</artifactId><version>${springdoc.version}</version></dependency><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-api</artifactId><version>${springdoc.version}</version></dependency><dependency><groupId>io.swagger.core.v3</groupId><artifactId>swagger-annotations-jakarta</artifactId><version>${swagger.core.version}</version></dependency><!--fastjson 版本--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!-- 多数据源依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot3-starter</artifactId><version>${dynamic-ds.version}</version></dependency><!--  阿里云短信下发 --><dependency><groupId>io.springboot.sms</groupId><artifactId>aliyun-sms-spring-boot-starter</artifactId><version>${sms.version}</version></dependency><!--  seata kryo 序列化--><dependency><groupId>io.seata</groupId><artifactId>seata-serializer-kryo</artifactId><version>${seata.version}</version></dependency><!--orm 相关--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>${mybatis-plus.version}</version></dependency><!--hutool bom 工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-bom</artifactId><version>${hutool.version}</version><type>pom</type><scope>import</scope></dependency><!--mica bom 工具类--><dependency><groupId>net.dreamlu</groupId><artifactId>mica-bom</artifactId><version>${mica.version}</version><type>pom</type><scope>import</scope></dependency><!--web 模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version><exclusions><!--排除tomcat依赖--><exclusion><artifactId>spring-boot-starter-tomcat</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.3.0</version></dependency></dependencies></dependencyManagement><build><plugins><!--打包jar 与git commit 关联插件--><plugin><groupId>io.github.git-commit-id</groupId><artifactId>git-commit-id-maven-plugin</artifactId><version>${git.commit.plugin}</version></plugin><!--代码格式插件,默认使用spring 规则--><plugin><groupId>io.spring.javaformat</groupId><artifactId>spring-javaformat-maven-plugin</artifactId><version>${spring.checkstyle.plugin}</version></plugin></plugins></build></project>

源码信息

和“SpringCloud实战”对应的源码信息如下:

  • github https://github.com/r0ad/spring-cloud-example
  • gitee https://gitee.com/r0ad/spring-cloud-example

关于作者

来自一线全栈程序员nine的八年探索与实践,持续迭代中。欢迎关注“雨林寻北”或添加个人卫星codetrend(备注技术)。

相关文章:

  • RabbitMQ - 06 - Topic交换机
  • 交易平台开发:构建安全/高效/用户友好的在线交易生态圈
  • 微信小程序uniapp+django+python的酒店民宿预订系统ea9i3
  • 早鸟票最后3天!「黄钊的AI日报·第三季」
  • CentOS/Fedora/Ubuntu/Debian 系统 wget 命令
  • Spring Cloud Gateway自定义过滤器
  • spring boot3token拦截器链的设计与实现
  • C语言初学10:typedef
  • 【Python】time模块
  • 采用 Amazon DocumentDB 和 Amazon Bedrock 上的 Claude 3 构建游戏行业产品推荐
  • 03.axios数据提交和错误处理
  • Spring Security的API Key实现SpringBoot 接口安全
  • unity学习(53)——选择角色界面--分配服务器返回的信息
  • 【Linux】gcc与make、makefile
  • Golang + Redis解决缓存击穿(双层缓存)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • JavaScript新鲜事·第5期
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Mysql优化
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • PAT A1050
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 分享一份非常强势的Android面试题
  • 爬虫模拟登陆 SegmentFault
  • 全栈开发——Linux
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 用Visual Studio开发以太坊智能合约
  • 优化 Vue 项目编译文件大小
  • 在weex里面使用chart图表
  • - 转 Ext2.0 form使用实例
  • 仓管云——企业云erp功能有哪些?
  • ​linux启动进程的方式
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #define 用法
  • #QT(TCP网络编程-服务端)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)fgets与fputs函数详解
  • (ros//EnvironmentVariables)ros环境变量
  • (实战篇)如何缓存数据
  • (转)编辑寄语:因为爱心,所以美丽
  • .htaccess配置常用技巧
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET企业级应用架构设计系列之开场白
  • .so文件(linux系统)
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [C++] sqlite3_get_table 的使用
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [CF482B]Interesting Array
  • [CTSC2014]企鹅QQ
  • [iOS]让Xcode 4.2生成的app支持老的iOS设备(armv6)