一、Spring Cloud 和 Spring Boot版本选择
1.选择Spring Boot版本
2022年3月30日,国家信息安全漏洞共享平台(CNVD)收录了Spring框架远程命令执行漏洞(CNVD-2022-23942),漏洞影响的产品版本包括:版本低于5.3.18和5.2.20的Spring框架或其衍生框架构建的网站或应用。
查询spring boot版本 SpringBoot2.6.6最新版本对应spring-framework的5.3.18版本,所以采用SpringBoot版本2.6.6。
查询方法:进入mvnrepository.com/ 输入Spring Boot Starter 进入 mvnrepository.com/artifact/or… 选择版本进入 mvnrepository.com/artifact/or… 查看[org.springframework]对应的版本号(5.3.18)
2.选择Spring Cloud版本
根据SpringBoot版本选择Spring Cloud版本
- Spring Cloud官网可以查看版本配置 spring.io/projects/sp…
- 访问 访问start.spring.io/actuator/in… 查看配置
"spring-cloud": {
"Hoxton.SR12": "Spring Boot >=2.2.0.RELEASE and <2.4.0.M1",
"2020.0.5": "Spring Boot >=2.4.0.M1 and <2.6.0-M1",
"2021.0.0-M1": "Spring Boot >=2.6.0-M1 and <2.6.0-M3",
"2021.0.0-M3": "Spring Boot >=2.6.0-M3 and <2.6.0-RC1",
"2021.0.0-RC1": "Spring Boot >=2.6.0-RC1 and <2.6.1",
"2021.0.1": "Spring Boot >=2.6.1 and <2.6.7-SNAPSHOT",
"2021.0.2-SNAPSHOT": "Spring Boot >=2.6.7-SNAPSHOT and <3.0.0-M1",
"2022.0.0-M1": "Spring Boot >=3.0.0-M1 and <3.0.0-M2",
"2022.0.0-M2": "Spring Boot >=3.0.0-M2 and <3.1.0-M1" }
匹配选择Sping Cloud版本 2021.0.1
<!--springboot版本 -->
<spring-boot.version>2.6.6</spring-boot.version>
<!--spring-cloud版本-->
<spring-cloud.version>2021.0.1</spring-cloud.version>
''''
<!-- 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-boot配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.6</version>
<!-- 为了解决子工程单继承的问题,通过<type>pom</type>可以依赖于其他的pom父工程,从而将pom工程中的依赖都传递过来 -->
<type>pom</type>
<scope>import</scope>
</dependency>
二. Spring-cloud-alibaba组件选择
github.com/alibaba/spr… 每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本(经过验证,自行搭配各组件版本不保证可用)如下表所示(最新版本用*标记):
| Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Dubbo Version | Seata Version |
|---|---|---|---|---|---|
| 2021.0.1.0* | 1.8.3 | 1.4.2 | 4.9.2 | 2.7.15 | 1.4.2 |
| 2.2.7.RELEASE | 1.8.1 | 2.0.3 | 4.6.1 | 2.7.13 | 1.3.0 |
| 2.2.6.RELEASE | 1.8.1 | 1.4.2 | 4.4.0 | 2.7.8 | 1.3.0 |
| 2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE | 1.8.0 | 1.4.1 | 4.4.0 | 2.7.8 | 1.3.0 |
| 2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE | 1.8.0 | 1.3.3 | 4.4.0 | 2.7.8 | 1.3.0 |
| 2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE | 1.7.1 | 1.2.1 | 4.4.0 | 2.7.6 | 1.2.0 |
| 2.2.0.RELEASE | 1.7.1 | 1.1.4 | 4.4.0 | 2.7.4.1 | 1.0.0 |
| 2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE | 1.7.0 | 1.1.4 | 4.4.0 | 2.7.3 | 0.9.0 |
| 2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE | 1.6.3 | 1.1.1 | 4.4.0 | 2.7.3 | 0.7.1 |
毕业版本依赖关系(推荐使用)
下表为按时间顺序发布的 Spring Cloud Alibaba 以及对应的适配 Spring Cloud 和 Spring Boot 版本关系(由于 Spring Cloud 版本命名有调整,所以对应的 Spring Cloud Alibaba 版本号也做了对应变化)
| Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
|---|---|---|
| 2021.0.1.0 | Spring Cloud 2021.0.1 | 2.6.3 |
| 2.2.7.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
| 2021.1 | Spring Cloud 2020.0.1 | 2.4.2 |
| 2.2.6.RELEASE | Spring Cloud Hoxton.SR9 | 2.3.2.RELEASE |
| 2.1.4.RELEASE | Spring Cloud Greenwich.SR6 | 2.1.13.RELEASE |
| 2.2.1.RELEASE | Spring Cloud Hoxton.SR3 | 2.2.5.RELEASE |
| 2.2.0.RELEASE | Spring Cloud Hoxton.RELEASE | 2.2.X.RELEASE |
| 2.1.2.RELEASE | Spring Cloud Greenwich | 2.1.X.RELEASE |
| 2.0.4.RELEASE(停止维护,建议升级) | Spring Cloud Finchley | 2.0.X.RELEASE |
| 1.5.1.RELEASE(停止维护,建议升级) | Spring Cloud Edgware | 1.5.X.RELEASE |
1. 使用 Spring Cloud 2021 版本,请在 dependencyManagement 中添加如下内容
<properties>
...
<cloud.alibaba.version>2021.0.1.0</cloud.alibaba.version>
...
</properties>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2. 子项目引入nacos
<!-- nacos依赖 接入 Nacos 作为注册中心,实现服务的注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
三.父项目创建pom.xml 注意事项:pom.xml中使用maven分模块管理 pom 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--
(1) groupId:存储的包的路径,一般分为多段,第一段为域,第二段为公司名。。。。。。如图,org是域中的一个,和它类似的
还有com、cn等,org为非盈利组织,com为商业组织。
(2) artifactId:模块名 它们统称为坐标,是为了保证项目的唯一性提出的,如果把自己的项目弄到maven本地仓库去,必须通过groupId+artifactId去查找。
(3) version 它是用来声明版本号的。在父pom中通常将一些通用的组件的版本号抽取出来,统一做版本号管理,当再次用到这个组件时就不用再去声明版本号了,
这样做还可以避免因为组件版本不一致带来的冲突问题。
-->
<groupId>com.baize</groupId>
<artifactId>baize-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
以下配置<packaging>pom</packaging>的意思是使用maven分模块管理,都会有一个父级项目,
pom文件一个重要的属性就是packaging(打包类型),一般来说所有的父级项目的packaging都为pom,
packaging默认类型jar类型,如果不做配置,maven会将该项目打成jar包
-->
<packaging>pom</packaging>
<!--这里设置版本号,父类做版本统一管理 properties里面可以定义用户自己的属性值,这些属性值可以在POM文件的任何地方同通过${x}的方式来引用 -->
<properties>
<!--java版本18:该版本比较稳定,使用者较多,兼容性较好 -->
<java.version>1.8</java.version>
<!--springboot版本 -->
<spring-boot.version>2.6.6</spring-boot.version>
<!--spring-cloud版本-->
<spring-cloud.version>2021.0.1</spring-cloud.version>
<!-- Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。
此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务
-->
<cloud.alibaba.version>2021.0.1.0</cloud.alibaba.version>
<!--swagger3接口API文档生成 -->
<springfox.swagger3.version>3.0.0</springfox.swagger3.version>
<!--swagger UI界面 bootstrap-ui-->
<swagger-bootstrap-ui.version>1.9.6</swagger-bootstrap-ui.version>
<!--swagger UI界面 knife4j;knife4j和 bootstrap-ui 两个选择一个,选择knife4j-->
<swagger-knife4j.version>3.0.3</swagger-knife4j.version>
<!-- fastjson依赖是阿里巴巴提供的用于处理json-object数据转换。接收前端传过来的json参数数据,转换成Java对象-->
<fastjson.version>1.2.70</fastjson.version>
<!--lombok依赖 Lombok的原理是在编译生成AST之后,根据注解对AST进行修改,比如增加上Getter、Setter方法,然后用修改后的AST生成字节码。-->
<lombok.version>1.18.8</lombok.version>
<!--jasypt加密解密配置文件 -->
<jasypt.version>2.0.0</jasypt.version>
<!--JJWT鉴权(JSON Web Token):用户登录使用taken -->
<jjwt.version>0.9.1</jjwt.version>
<!-- 常用的时间处理类库 -->
<joda-time.version>2.10.8</joda-time.version>
<!-- 阿里云短信接口sdk -->
<aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>
<!-- Hutool 是一个小而全的 Java 工具类库-->
<hutool.version>4.5.6</hutool.version>
<!--commons工具包-->
<commons-lang3.version>3.9</commons-lang3.version>
<!--jackson Java Json解析器-->
<jackson.version>2.10.3</jackson.version>
<!-- 开源对象池化组件-->
<commons-pool2.version>2.6.2</commons-pool2.version>
</properties>
<!-- dependencyManagement只在父工程(即pom类型的maven工程)中声明,在子工程中定义无需声明版本从而生效 -->
<dependencyManagement>
<dependencies>
<!-- 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-boot配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.6</version>
<!-- 为了解决子工程单继承的问题,通过<type>pom</type>可以依赖于其他的pom父工程,从而将pom工程中的依赖都传递过来 -->
<type>pom</type>
<scope>import</scope>
</dependency>
<!--
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。
此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务
-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--swagger3接口API文档依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${springfox.swagger3.version}</version>
</dependency>
<!--swagger-ui 这里是用了一个好看一点ui界面-->
<!--<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>${swagger-bootstrap-ui.version}</version>
</dependency>-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${swagger-knife4j.version}</version>
</dependency>
<!-- fastjson依赖是阿里巴巴提供的用于处理json-object数据转换。接收前端传过来的json参数数据,转换成Java对象 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--lombok依赖 Lombok的原理是在编译生成AST之后,根据注解对AST进行修改,比如增加上Getter、Setter方法,然后用修改后的AST生成字节码。-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<!--jasypt加密解密依赖 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>${jasypt.version}</version>
</dependency>
<!--JJWT鉴权(JSON Web Token):用户登录使用taken -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- 常用的时间处理类库 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<!-- 阿里云短信接口sdk -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>${aliyun-java-sdk-dysmsapi.version}</version>
</dependency>
<!-- Hutool 是一个小而全的 Java 工具类库-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--commons工具包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<!--jackson Java Json解析器-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!--jackson Java Json解析器-->
<!-- 开源对象池化组件-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<!-- maven打包指定jdk版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<!-- maven测试框架的依赖-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<!-- maven 打war包配置:failOnMissingWebXml=false避免缺少web.xml导致failOnMissingWebXml错误-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<!-- maven打jar包依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<!-- 将spring boot的应用程序打包-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 插件主要是用来打包源代码的-->
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<!--解决资源导出问题-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>