前言
请注意,从2022年第四季度发布的 Spring 6 框架开始,最低 Java 版本要求已提升至 JDK 17。Spring 6 对内部架构进行了重构,并将最低 Java 版本要求改为 JDK 17。同样,Spring Boot 3 也将要求最低 Java 版本为 JDK 17,同时spring官网上和 IntelliJ IDEA工具里创建项目已经下架了springboot2和jdk8系列。
尽管 JDK 17 和 Spring Boot 3 带来了众多新特性和性能提升,许多项目仍倾向于采用 JDK 8 和 Spring Boot 2。这主要归因于以下四点:
- 高度的成熟与稳定:JDK 8 和 Spring Boot 2 经过时间的考验,展现出极高的成熟度与稳定性,为长期运行的企业级应用提供了坚实的基础。
- 广泛的社区支持:它们拥有庞大的开发者社群,丰富的资源和广泛的第三方库及工具支持,为开发者带来了极大的便利。
- 良好的兼容性与较低的迁移成本:与现有系统无缝对接,避免了高昂的迁移成本,包括代码重构、测试及人员培训等。
- 性能满足需求:尽管 JDK 17 和 Spring Boot 3 在性能上有所提升,但 JDK 8 和 Spring Boot 2 的性能已足够应对大多数应用场景。
综上所述,JDK 8 + Spring Boot 2 凭借其无可比拟的成熟度、稳定性和广泛的社区支持,仍然是众多项目的首选。然而,对于新项目,建议考虑采用 JDK 21 + Spring Boot 3,特别是其引入的虚拟线程技术,将极大提升并发性能并简化多线程编程。但请注意,这项技术尚需市场的进一步验证且目前网上资料相对较少。对于老项目,则建议保持现状,以避免不必要的迁移风险。
本文将详细指导如何在 IntelliJ IDEA 中创建 Maven 聚合工程,并引入已停止官方发布的 Spring Boot 2 版本。Spring Boot 3 的工程创建步骤与此类似,读者可参照执行。
1 需要的环境与项目结构
环境说明:windows11、idea2023.3.8,maven3.6.3、openjdk8、springboot2.7.18
- idea2023.3.8官网地址:idea官网下载
- maven:windwos安装多版本Maven(图文详细版)
- openjdk:OracleJDK与OpenJDK的区别(附带win11下多版本jdk安装)
- SpringBoot官网:SpringBoot版本说明
jialiangkj-pet-common: 通用模块,项目中常用的一些工具类和公共类等。
jialiangkj-pet-pojo: 实体类模块,存放实体类对象,例如: BO、VO等对象。
jialiangkj-pet-mapper四: dao接口模块,专门存放操作数据库的dao接口。
jialiangkj-pet-service: 业务模块,进行业务逻辑的处理。
jialiangkj-pet-api: 控制器模块,用于页面请求api访问,
2 Idea新建Maven工程
浏览器打开springboot官网(环境说明里有),查看可选择的GA版本
Spring Boot版本说明
- GA版本
- 含义:General Availability,即正式发布的稳定版本。
- 特点:官方推荐,适合生产环境使用,已经经过充分测试和验证。
- 其他版本标识
- M版本:里程碑版本,开发周期的阶段性成果,可能包含未修复的bug或不稳定功能。
- RC版本:候选版本,接近最终发布版本,已经经过大量测试和验证,但仍可能包含小调整。
- SNAPSHOT版本:快照版本,处于开发阶段,用于持续集成和部署,可能包含未完成的新特性或修复。
- 版本号命名规则
- 使用三个整数表示:主版本号、次版本号和修订版本号。
- 主版本号增加:API或框架行为不兼容改变,或重大新特性引入。
- 次版本号增加:新特性引入,但API或框架行为兼容。
- 修订版本号增加:bug修复或非破坏性修改。
- 主版本号为偶数表示稳定版本,奇数表示开发版本。
Spring Boot的版本号及其相关标识对于选择合适的版本对项目开发至关重要。GA版本是稳定且推荐使用的版本,而其他版本标识则提供了关于版本稳定性和开发阶段的重要信息。
spring官方模版新建时无法选择旧版本创建
打开idea可以选择创建spring项目
可以看到目前创建springboot新工程最低版本要求是3.2.11
因为我们要创建springboot2.7.18版本,所以不选择上述创建方式,思路是先创建maven聚合工程,然后再引入springboot低版本的依赖
打开idea新建工程
根据自己需要填写项目名称,保存路径等
选择已有的jdk,此处选择spring官方推荐使用BellSoft Liberica JDK
点击创建后选择this windows当前窗口打开项目工程
配置本地maven库
根目录模块下鼠标右键添加api模块
创建模块api模块
添加common通用模块
添加mapper模块
添加pojo模块
添加service模块
添加模块完成后点击项目根目录模块的pom文件可以看到如下
加入项目名称、项目地址、项目描述
<name>jialiangkj-pet-dev</name>
<url>htttp: gitte、github</url>
<description>佳良宠物商城后台</description>
加入输出为UTF-8编码模式,删除项目创建时多余的内容
<properties>
<java.version>1.8</java.version>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
加入一些聚合工程描述说明
<!--
1. 聚合工程里可以分为顶级项目(顶级工程、父工程)与子工程,这两者的关系其实就是父子继承的关系
子工程在maven里称之为模块(module),模块之间是平级,是可以相互依赖的。
2. 子模块可以使用顶级工程里所有的资源(依赖),子模块之间如果要使用资源,必须构建依赖(构建关系)
3. 一个顶级工程是可以由多个不同的子工程共同组合而成。
-->
完成以上步骤后pom文件
3 SpringBoot引入并测试
添加springboot依赖管理,一般在中大型项目中会选择使用做版本依赖管理,具体作用如下
<dependencyManagement>
用于集中管理依赖的版本和其他配置信息,避免在多个模块中重复定义相同的依赖版本。具体作用如下:
- 集中管理依赖版本:在父 POM 中定义依赖版本,子模块直接继承,无需重复定义。
- 提供默认配置:为依赖提供默认的配置信息,如版本、范围、类型等。
- 避免版本冲突:确保整个项目的依赖版本一致,减少潜在的兼容性问题。
这样做的好处是,当需要更新依赖版本时,只需在父 POM 中修改一次,所有子模块都会自动使用新的版本,确保项目各子模块版本依赖一致。
添加版本号信息值,自己的软件版本号此处我写1.0.0,值随意自己用,springboot版本号2.7.18
<properties>
<jialiangkj-pet-dev.version>1.0.0</jialiangkj-pet-dev.version>
<spring-boot.version>2.7.18</spring-boot.version>
</properties>
添加springboot依赖项,和项目构建
<dependencyManagement>
<dependencies>
<!-- SpringBoot的依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
加入环境配置,local、dev、prod分别对应本地环境、开发环境、生成环境,这里默认是开发环境,任意在pom文件下添加即可
可用于配置application在不同环境时的启动选择和对应的日志级别(可根据自己需要增加或减少配置环境)
<profiles>
<profile>
<id>local</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>local</profiles.active>
<logging.level>info</logging.level>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active>
<logging.level>info</logging.level>
</properties>
<activation>
<!-- 默认环境 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
<logging.level>warn</logging.level>
</properties>
</profile>
</profiles>
添加代码更新依赖后,会看到环境选择
在common的pom文件里添加springboot-web的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
然后给各模块添加逐级依赖关系,api->service->mapper->pojo->common,按照此依赖关系分别在pom文件里进行添加依赖关系
api模块,除了引用service模块外还需要添加项目构建
<dependencies>
<dependency>
<groupId>cn.com.jialiangkj</groupId>
<artifactId>jialiangkj-pet-service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-plugins.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 关闭过滤 -->
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<!-- 引入所有 匹配文件进行过滤 -->
<includes>
<include>application*</include>
<include>bootstrap*</include>
<include>banner*</include>
</includes>
<!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
<filtering>true</filtering>
</resource>
</resources>
</build>
service模块
<dependencies>
<dependency>
<groupId>cn.com.jialiangkj</groupId>
<artifactId>jialiangkj-pet-mapper</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
mapper模块
<dependencies>
<dependency>
<groupId>cn.com.jialiangkj</groupId>
<artifactId>jialiangkj-pet-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
pojo模块
<dependencies>
<dependency>
<groupId>cn.com.jialiangkj</groupId>
<artifactId>jialiangkj-pet-common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
分别添加对应的依赖,记得添加坐标后点一下右上角的maven更新不然会无效
依赖下载完毕后在api模块新建application.yml、application-local.yml、application-dev.yml、application-prod.yml
其中application.yml配置如下
# app访问端口号 约定:8090
server:
port: 8090
max-http-header-size: 8KB # 设置HTTP头的最大大小
tomcat:
max-connections: 2000 # 设置Tomcat的最大连接数
max-threads: 200 # 最大线程数
max-http-form-post-size: 2MB # 设置表单POST请求的最大大小
uri-encoding: UTF-8
connection-timeout: 10000 # 连接超时时间,单位是毫秒
查看API模块下的依赖,可以看到已经按层级添加成功
在api模块下添加springboot启动应用
package cn.com.jialiangkj;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
新建一个controller包,存放http请求的控制器
在其下新添加一个名为TestController的控制器类
添加如下测试代码
package cn.com.jialiangkj.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/hello")
public String hello(){
return "Hello World!";
}
}
在根目录工程点击,install安装各模块
鼠标右键点击运行Application启动应用程序
应用启动成功
打开浏览器输入:localhost:8090/test/hello,可以看到已经正常返回Hello World
4 聚合工程测试
在service模块下添加servcie和impl包
在service下添加一个TestService接口,如果包关系已经折叠可以选择展开新增
在TestService下添加以下测试代码
package cn.com.jialiangkj.service;
public interface TestService {
public String helloTest();
}
在impl包下新建一个TestServiceImpl实现类,用于实现TestService接口里的方法
package cn.com.jialiangkj.service.impl;
import cn.com.jialiangkj.service.TestService;
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl implements TestService {
@Override
public String helloTest() {
return "helloTest: hello world!";
}
}
返回api模块找到之前创建的TestController控制器,添加测试代码
@Autowired
private TestService testService;
@GetMapping("/helloTest")
public String helloTest(){
return testService.helloTest();
}
点击install安装模块后,再重新运行Application
注意:一定要重新install后才能重新运行程序,否则模块代码依赖没安装上运行会报错或者没效果。
打开浏览器输入:http://localhost:8090/test/helloTest
可以看到已经正常加载到对应接口里引入的service代码,至此maven搭建springboot聚合工程已经完成。
5 springboot3版本引入
springboot3官方建议最低需要jdk17,所以在引入之前请确保自己电脑的环境变量里已经加载了jdk17或以上版本。
示例环境:idea2023.3.8、opendjk21、springboot3.2.11、maven3.9.9
为了方便,我们把上面已经完成的spring2.7.18项目工程,复制一份修改jdk和maven环境和springboot版本号即可。
修改jdk版本,打开ide的项目设置
注意此处需要本机环境变量切换到jdk21具体请参考 章节1 需要的环境与项目结构 有openjdk多版本安装和切换教程。
项目工程设置为jdk21
打开设置把编译环境设置为jdk21
修改maven版本和仓库路径,打开idea进入settings设置
注意此处需要本机环境变量切换到maven3.9.9具体请参考 章节1 需要的环境与项目结构 有maven多版本安装和切换教程。
确认jdk版本是否已经选为21,如果没有则自行选择与环境变量匹配的jdk版本
修改完毕后,找到根目录下的pom文件,修改maven的版本依赖
<spring-boot.version>3.2.11</spring-boot.version>
<java.version>21</java.version>
<maven-plugins.version>3.9.0</maven-plugins.version>
为了方便我们测试查看效果,把api模块下的application端口号修改为9091
修改完毕后清除打包的依赖,重新安装各模块依赖
启动运行application,可以看到此处已经使用springboot3.2.11和java21启动运行项目
打开浏览器输入:http://localhost:9001/test/helloTest,可以查看到对应的访问效果
6 不同环境启动项目
之前在上面创建工程时,我们引入了多环境的配置,他们分别对应着maven的编译环境和application对应环境的文件配置,关系如下图
在application.yml文件里,我们还需要添加配置绑定启动文件,这样yaml就会读取根目录下profiles.active的值,由于我们在右侧勾选了dev,此处对应值是dev
# Spring配置
spring:
profiles:
active: @profiles.active@
如果运行程序后报错,需要重新刷新maven依赖,或者检查根目录下的pom文件里资源过滤配置是否添加
配置完毕后,启动程序会按下图1、2步骤执行
可以看到启动程序后端口已经安装dev下设置运行
在实际项目开发中,可根据项目需要灵活设置本地环境、开发环境、生产环境的配置项