一步步搭建JDK 21 Spring Boot项目

摘要:使用IntelliJ Idea 快速构建一个基于JDK 21和Spring Boot 4的项目,包含从项目搭建、功能验证到打包部署的完整实战流程。

综述

  你好,2025!你好,新一代 Spring!在 2025 年岁末Spring 家族迎来了其发展史上的又一里程碑——Spring Boot 4 与 Spring Framework 7 携手而至,预示着 Spring Boot 3.0+ 时代正静悄悄地、优雅地画上句号,而新的传奇正待书写!此次迭代,Spring 团队将“开箱即用”的理念推向新高度,进一步优化云原生支持,让构建高可用、可观测、高弹性的应用变得前所未有地简单直接。

  性能方面更是实现了惊人突破,不仅轻松驾驭百万级并发,性能再攀新高,更通过轻量级部署方案,使 Serverless(无服务器) 和微服务场景下,服务器资源成本锐减 80%,性价比拉满。这一切,都构建在已成为企业级开发主流的 JDK 21 之上,其丰富的长期支持新特性,为新一代 Spring 应用注入了澎湃动力。

  还在为搭建 Spring 项目时繁琐的配置而头疼吗?Spring Boot 正是为此而生!作为 Spring 家族的得力干将,它的目标只有一个:让你的开发效率飙升。Spring Boot 奉行“约定优于配置”的核心理念,这意味着你不再需要编写大量的样板代码。它已经为你做出了最佳实践的预设,让你能够以最快的速度启动和运行一个 Spring 应用。

  告别部署 WAR 文件的时代吧!Spring Boot 内部集成了 Tomcat、Jetty 等主流服务器,让你的应用一键启动。不仅如此,它还集成了生产环境所需的全部核心能力——从安全、度量、健康检查到外部化配置——确保您从第一行代码开始,便构建出一个健壮、可观测且准生产级的应用。

  技术变革太快,赶紧学起来。对于一个现代化的Java应用程序来说,选择合适的工具和技术栈至关重要,JDK 21和Spring Boot 4.0+无疑是当前最前沿的选择之一。若想了解更多 Spring Boot 新特性,请移步官网传送门

  在《基于intellij IDEA 快速搭建Spring Boot项目》中,小编给大家简单地介绍了使用IntelliJ Idea基于JDK 8来创建Spring Boot项目的方法,本文介绍在IntelliJ Idea中如何使用在线工具Spring Initializr快速搭建一个简单的Spring web mvc Restful项目,使用的JDK版本号是 21.0.6。我们先好奇地总览一下项目结构图:

环境介绍

  • 机器配置:MacBook Pro Apple M1芯片;
  • IntelliJ IDEA:2023.2.5 (Ultimate Edition);
  • java version :21.0.6;
  • maven:4.0.0;
  • Apache Tomcat:11.0.14;
  • spring-boot:4.0.0;
  • Spring Framework: 7.0.0。

创建maven项目

  1、打开IDEA,通过File-->New-->Project进入图二所示的 New Project 创建页。


图1 开始新建项目

  2、选择Spring初始化器 Spring Initializr,设置jdk版本号 21,点击Next。注意,idea默认使用https://start.spring.io提供的在线模板,所以需要保证网络畅通。

image
图2 New Project创建页

  Name属性用于给项目命名,请根据业务诉求自定义;Location用于指定项目存储路径,可以事先创建一个文件夹用来存储项目。Spring Boot项目通常使用Maven或Gradle作为构建工具,我在本文示例中选择Maven。设置完Group和Artifact等属性后点击 Next继续搭建Spring Boot项目。

  3、添加依赖项。首先,根据架构师要求选择对应的Spring Boot版本号,我设置的是4.0.0;然后,单击Web,勾选Spring Web构建RESTful API,也可以同时设置SQL和Lombok等依赖项;最后,点击Create按钮完成项目创建。

image
图3 设置依赖项

  当勾选多个项目依赖项的时候,视图如图3右侧Added Dependencies所示。

  如果是首次搭建 Spring Boot 项目,初始化工作可能需要比较长的时间,请准备良好的网络环境;如果网络不好,可以单击reimport按钮,重新加载依赖包。

image
图4 刷新依赖项

  项目被初始化后,自动生成的项目结构如下:

image
图5 初始化后自动生成的项目结构

  上述目录结构标志着你的Spring Boot项目已经成功创建,可以开始配置项目环境了。

  此时此刻你已经拥有了一个完整的Spring Boot项目框架。开发者在深度掌握项目结构后可以更好地组织代码,提升项目的可维护性和扩展性。同时,遵循Spring Boot的最佳实践,能够帮助开发者构建出高质量、高稳定和高扩展的应用程序。从图5得知一个经典的Spring Boot项目通常包含以下几个部分:

  • src/main/java:存放Java源代码文件。这里有应用程序的基础包路径com.cactus.wiener,它包括控制器、服务层、数据访问层等组件。
  • src/test/java:存放单元测试和集成测试代码。良好的测试覆盖率能够确保代码的质量和服务的稳定性。
  • src/main/resources:存放资源文件,如配置文件、静态资源和模板文件。
  • pom.xml(Maven)或build.gradle(Gradle):定义项目的依赖关系和构建配置。通过合理的依赖管理,可以确保项目始终使用最新的库和工具。

配置项目环境

  配置应用程序的主要参数。需要自己编辑application.properties里的内容,这里可以设置诸如服务器端口、数据库连接信息等关键配置。例如:

spring.application.name=wiener
server.port=8080
server.servlet.context-path=/wiener

  这里配置了项目端口号server.port=8080。通过合理的配置,不仅可以提升应用程序的性能,还能增强其灵活性和可维护性。此外,别忘了配置日志级别,以便在开发过程中能够及时获取有用的调试信息。自动生成的pom文件内容如下所示:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>4.0.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cactus</groupId>
    <artifactId>wiener</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>wiener</name>
    <description>wiener</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>21</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webmvc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webmvc-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

  spring-boot-maven-plugin 是Spring Boot 的编译插件,会自动添加到依赖项。检查pom配置并确认所有依赖项正确无误。特别是Spring Boot的版本号,确保其为4.0.0,以充分利用最新版本带来的性能优化和新特性。

  在Java开发中,依赖管理是确保项目稳定性和可维护性的关键环节。通过构建工具(如Maven或Gradle)进行统一管理和自动化处理依赖关系,可以进一步优化项目的构建过程,简化开发流程,还能有效避免版本冲突和兼容性问题。

  日志管理是确保应用程序稳定性和可维护性的关键环节。良好的日志记录不仅可以帮助开发者快速定位问题,还能为后续的性能分析和故障排查提供有力支持。在src/main/resources目录下创建log4j2.xml,添加如下日志配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
        </Console>
        <File name="log" fileName="log/webApp.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
        </File>
        <RollingFile name="RollingFile" fileName="log/webAppRoll.log" filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
            <SizeBasedTriggeringPolicy size="50MB" />
        </RollingFile>
    </appenders>
    <loggers>
        <root level="INFO">
            <appender-ref ref="RollingFile" />
            <appender-ref ref="Console" />
        </root>
    </loggers>
</configuration>

这个日志配置比较简单,有待优化,仅供参考。这样,当应用程序运行时,相关的日志信息将会被记录下来,帮助开发者更好地理解程序的执行过程,排查异常问题。

项目调试与运行

  万事俱备,只欠东风。现在,让我们编写第一个根据用户ID查询用户信息的简单程序,体验一下Spring Boot的魅力。创建测试代码所需实体类 User,属性包括用户ID和用户名,如下所示:

package com.cactus.wiener.bean;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serial;
import java.io.Serializable;

@Getter
@Setter
@ToString
public class User implements Serializable {
    @Serial
    private static final long serialVersionUID = -4738792232525542103L;
    private Long id;

    private String name;
    private String msg;
    private Integer age;

    /**
     * 无参构造器
     */
    public User() {
    }

    public User(Long id) {
        this.id = id;
    }
}

  添加如下测试用的控制器 UserController:

package com.cactus.wiener.controller;

import com.cactus.wiener.bean.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
    private static Logger logger = LoggerFactory.getLogger(UserController.class);

    @PostMapping("/getUser")
    public User getUser(@RequestBody User user) {
        logger.info("执行结果user = {}", user);
        return user;
    }

    @GetMapping("/getUserById/{id}")
    public User getUserById(@PathVariable(value = "id", required = false) Long userId) {
        User user = new User();
        user.setName("spring boot 4 + jdk 21");
        user.setId(userId);
        logger.info("执行结果user = {}", user);
        return user;
    }

}

  在这个类中,我们实现了一个简单的HTTP get请求处理方法getUserById,返回录入的用户ID,并且设置默认用户名 spring boot 4 + jdk 21。这段代码虽然简单,却蕴含着强大的功能。@RestController 注解表明这是一个RESTful风格的控制器,而@GetMapping("//getUserById/{id}")则设置了HTTP GET请求的基础访问路径,@PathVariable 注解将URL 路径中的动态变量{id}绑定到控制器方法的请求参数userId上。

  在服务启动前,请再次到settings中二次检查jdk版本是否为设置的jdk 21,如果不是,请调整:

image
图6 在 Settings页面设置jdk版本

  这时候已经来到了检验成果的时刻,在启动类WienerApplication中以debug模式启动服务:

image
图7 以调试模式启动服务

  几秒钟后,可以看到控制台输出的下述打印结果:

image
图8 服务启动日志

  图中带红色下划线的日志说明应用程序已经加载各项配置和服务,而且,端口号是8080,JDK版本号是21.0.6。此时在浏览器访问http://localhost:8080/wiener/user/getUserById/100即可看到下图所示的页面效果:

image
图9 api调用结果

  控制台打印结果如下:

2025-12-01T19:53:02.829+08:00  INFO 37424 --- [wiener] [nio-8080-exec-3] c.c.wiener.controller.UserController  : 执行结果user = User(id=100, name=spring boot + jdk 21, msg=null, age=null)

  这一刻,所有的努力都开花结果。为了确保应用程序的稳定性和可靠性,建议进行全面的测试。

打包部署项目

  利用Maven的生命周期管理功能,可以定义一系列构建阶段的任务。通过合理配置这些阶段,开发者可以实现自动化构建和持续集成,提高项目的交付速度和质量。在IDEA右侧找到Maven tab也,双击lifecycle中的 clean按钮,清理之前构建的jar包:

image
图10 clean和package按钮

  在clean操作执行完毕后,target目录会被删除。双击package即可生成jar包:

image
图11 打包

  可以把文件wiener-0.0.1-SNAPSHOT.jar拷贝到其它地方使用java -jar命令执行,比如我这里直接拷贝到C盘根目录/Users/xxx/Desktop/doing,然后从终端进入doing目录并用Java -jar wiener-0.0.1-SNAPSHOT.jar部署服务:

image
图12 部署服务

  打开浏览器,在地址栏输入 URLhttp://localhost:8080/wiener/user/getUserById/100后回车即可得到与图9一样的结果。URL中localhost代表本地服务器地址,若项目部署在远程服务器,需替换为对应服务器 IP地址。

  通过以上步骤,一个结合JDK 21和Spring Boot 4.0.0版本的项目搭建过程便告一段落。希望这篇实战指南能够帮助读者掌握Java开发的核心技能,开启属于自己的编程之旅。

结束语

  程序员是干到老学到老的行业,框架和工具的变更意味着我们会有更便利、更友好的调用方式,所以对于程序员是利好的,因此一起学起来、用起来、折腾起来吧。

  你的项目使用到了最新的JDK或者Spring Boot版本了吗?遇到什么问题吗?欢迎留言分享。✦喜欢的话请顺手点个赞,这对我十分重要,万分感谢!✦

Reference

posted @ 2025-12-04 20:02  楼兰胡杨  阅读(7)  评论(0)    收藏  举报