首页 > 其他分享 >如何简洁高效的搭建一个SpringCloud2023的maven工程

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

时间:2024-03-06 14:22:36浏览次数:32  
标签:依赖 spring boot maven version 模块 banana SpringCloud2023 搭建

前言

依赖管理有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的版本如何选择,具体可以查看合集里面的相关文档。

组件 版本
jdk 17
spring boot 3.2.x
spring cloud 2023.0.x
spring cloud alibaba 2022.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实战”对应的源码信息如下:

关于作者

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

标签:依赖,spring,boot,maven,version,模块,banana,SpringCloud2023,搭建
From: https://www.cnblogs.com/r0ad/p/18056451

相关文章

  • GFP-GAN环境搭建&推理测试
    引子近期,文生图,wav2lip很火,文生图,见识的太多,不多说了。wav2lip其通过语音驱动唇部动作并对视频质量进行修复,里面一般涉及到三个步骤,文本到语音转化,语音驱动唇部动作,图像质量修复。最后一步骤涉及到图像质量修复,考虑到之前做过基于GFP-GAN相关的工作,在此,总结汇总下。本文主要介绍......
  • Docker搭建smb共享服务器
    Docker搭建smb共享服务器快速启动dockerrun-it--namesamba\-p139:139\-p445:445\-v/path/to/share:/share_dir\-ddperson/samba\-u"username;password"\-s"share_name;/share_dir/;yes;no......
  • IDEA 如何配置Maven
    首先我们保证Maven环境配置已经没有问题的情况下,才可以进一步对idea进行配置,在此之前我们需要再做一步操作:能力有限不知道这一步叫啥但是知道这一步的操作步骤。首先找到Maven文件中的conf文件,其次建一个空文件找到conf文件里的setting.xml文件编辑它,在合适位置输入:空文件路......
  • 无人直播,云SRS,Docker一键搭建安装教程
    如果有服务器并已经安装Docker,可以直接从第四步开始。第一步:选购轻量应用服务器并安装Ubuntu22或者20系统。境外服务器以香港和日本、新加坡为佳。24小时无人直播流量需求比较大,请按照视频码率自己算好,超出后流量非常昂贵。【以视频码率5000为例:5000/8/1024*3600*24*31/1024/102......
  • Windows环境下Pytorch项目搭建在Docker中运行
    Windows环境下Pytorch项目搭建在Docker中运行1.安装windows版本的Docker​ 网上已有诸多博客教程,这里就不再赘述。2.搭建本地Pytorch环境​ 搭建本地Pytorch环境的方式我使用了两种方式,推荐使用第一种。​ 第一种:​ (1)在dockerhub中(https://hub.docker.com),找到自己版本......
  • Docker多容器和通信搭建(二)
    前言前面介绍了Docker容器的基础服务搭建,对于Docker容器来说一般都是多个容器项目运行在服务器上。所以这篇主要讲述多容器之间的交互,以及宿主与容器之间的交互问题。一、部署多容器接着以Nginx为例,部署多个Nginx容器进行测试。~]#dockerrun-d--namenginx-p80......
  • javaweb04-maven&web入门
    maven依赖管理:管理项目依赖的jar包,避免版本冲突统一项目结构:提供标准统一的项目结构标准的项目构建:标准跨平台的自动化项目构建方式maven坐标groupid:定义当前项目隶属组织名称artifactid:定义当前项目名称version:定义当前项目版本号依赖依赖传递排除依赖<exclusion>......
  • SpringCloud2023最新版本该如何进行组件选型?
    前言Developingdistributedsystemscanbechallenging.Complexityismovedfromtheapplicationlayertothenetworklayeranddemandsgreaterinteractionbetweenservices.Makingyourcode‘cloud-native’meansdealingwith12-factorissuessuchasextern......
  • 1_环境搭建和顺序语句
    环境搭建与顺序语句本地环境搭建我使用的是pycharm+Anconda。python解释器我使用的是3.8版本的。python语法基础Python语法官方文档变量常用数据类型:使用函数type()类型描述例子int整数5float浮点数5.2,1.23e6str字符串“字符串”bool布尔......
  • 解决 Maven 'parent.relativePath' of POM 问题
    解决Maven'parent.relativePath'ofPOM问题https://zhuanlan.zhihu.com/p/453547775<!--导入springboot父工程,规定的写法【版本2.1.8版本和人人fast对应】--><parent><groupId>org.springframework.boot</groupId><art......