☰
IDEA中创建SpringBoot项目全流程:从环境配置到第一个接口
2026/9/30 18:02:05 网站建设 项目流程

去年一年我帮好几个同事处理过“IDEA里创建SpringBoot项目”的各种问题,包括刚转Java的、从Eclipse迁移过来的,甚至还有几个经验不少但第一次用Spring Initializr的老手。我发现一个很有意思的现象:真正卡住人的往往不是SpringBoot本身,而是创建项目这个入口环节——版本选不对、依赖不知道勾哪个、项目建完启动就报错。这篇我直接把2023年这套流程掰开揉碎写清楚,从IDEA配置讲到第一个接口跑起来,每一步都解释为什么这么做。不废话,直接开始。

1. 动手前的准备:IDEA版本与JDK环境

1.1 IDEA旗舰版和社区版的区别,到底用哪个

IntelliJ IDEA分Ultimate(旗舰版)和Community(社区版)两个版本。旗舰版是收费的,社区版完全免费。很多新人会纠结这个问题,我直接说结论:如果你只是学SpringBoot、写点个人项目,社区版就够了。虽然早期社区版对SpringBoot的支持很有限,但2021以后JetBrains把很多功能下放给了社区版,现在社区版已经内置了Spring Initializr,能直接创建SpringBoot项目,这对个人学习和轻量开发完全够用。

不过有几点你心里要有数。社区版没有Spring相关的高级辅助功能,比如@Autowired的依赖注入图表、Spring Bean的可视化关联、Spring Boot运行时的Actuator面板、JPA Designer可视化工具等。这些在开发大型企业级项目时确实能提升效率,但在学习阶段、写毕设、做个人项目的场景下,缺失这些功能几乎没有影响。我自己早期写SpringBoot项目就是在社区版上完成的。另外旗舰版对于前端资源文件、JavaScript、TypeScript的智能提示也更完善一些,如果你同时搞前后端分离开发,旗舰版的体验会更顺。但如果你只是后端为主,社区版加上一个VS Code写前端就足够了。

如果你还在用2019、2020年甚至更老的IDEA版本,我强烈建议你升级。太老的版本内置的Spring Initializr模板很旧,生成的SpringBoot版本是2.1、2.2这类老版本,甚至有的版本根本不支持Spring Initializr向导,只能去网页端手动生成再导进来。而2023版的IDEA内置模板已经跟上了SpringBoot 3.x的节奏,还会读你本地Maven仓库里的版本信息,体验完全不一样。我见过太多人卡在“学校里用2018版IDEA,到公司打开项目一堆依赖报错”的窘境,真没必要用老版本为难自己。

1.2 JDK装错了,项目一启动就崩

创建SpringBoot项目之前,最好先确认JDK真的配好了。这里有一个2023年尤其容易踩的坑:SpringBoot 3.x要求JDK 17及以上,而SpringBoot 2.x用JDK 8或11都行。所以不是随便装个JDK就能跑通所有项目。我的建议是:学习新项目直接用JDK 17,这是目前性价比最均衡的版本。

怎么检查你电脑上的JDK?打开命令行工具,输入java -version,如果显示的是openjdk version "17.x.x"或者java version "1.8.0_xxx",你心里就有数了。如果提示“不是内部或外部命令”,那说明你的JAVA_HOME环境变量没配好,IDEA里即使配置了JDK路径,命令行也找不到。这里有个小技巧:IDEA其实不依赖系统的JAVA_HOME,你只要在Project Structure里指定了JDK路径,IDEA就能正常工作。但Maven在命令行里执行时需要JAVA_HOME,所以建议还是把环境变量配好,省得后面打包部署时出幺蛾子。

配JDK环境变量的时候,注意JAVA_HOME要指向JDK的安装根目录,而不是bin目录。Path里加%JAVA_HOME%\bin(Windows系统)或$JAVA_HOME/bin(macOS/Linux系统)。配置完打开新命令行窗口验证一下。如果IDEA里已经安装了多个JDK版本,可以在File -> Project Structure -> SDKs里添加不同版本,然后切换项目用的SDK。这一点对老项目和新项目来回切换很关键。

2. 创建项目:一步一步走完是关键

2.1 新项目向导里的那些配置项,到底什么意思

打开IDEA,点击File -> New -> Project,弹出的窗口里选择Spring Initializr。2023版IDEA在这里会分成两栏:左侧是项目模板类型,右侧是参数配置。这里每一个选项都有讲究。

  • Server URL:默认是https://start.spring.io,这是Spring官方的初始化服务地址,它会根据你选的参数生成一个项目压缩包。国内网络偶尔会连这个地址超时,如果碰到了,可以换成阿里云的镜像地址https://start.aliyun.com。但注意,阿里云镜像里某些新版本的SpringBoot可能还没同步,版本列表会落后一点,所以优先用官方地址,超时再切换。
  • Name(项目名称):就是你的项目名,会自动作为Artifact的一部分。注意项目名尽量用英文小写,短横线分隔(比如my-springboot-app),不要用中文或大写字母开头。否则后面Maven构建时会有奇怪的路径问题。
  • Language:默认Java就行。Kotlin和Groovy版本适合有其他需求的开发者,正常学SpringBoot选Java。
  • Type:Maven和Gradle二选一。Maven是主流选择,绝大多数教程、公司项目都用它,依赖管理生态成熟。Gradle构建更快、配置更灵活,但学习曲线稍陡,初学者别折腾,选Maven。
  • Group、Artifact、Package name:这三个是Maven坐标的核心。Group通常写公司域名倒序,比如com.example;Artifact通常和项目名一致;Package name默认就是com.example.myproject,这个就是你的包根路径,后面所有Java类都放在这个包下面。这里建议自己想清楚再填,建好项目再改包名很麻烦,IDEA的Refactor虽然能改,但涉及路径引用的地方多了会出问题。

把这些搞清楚之后,JDK栏选你安装的JDK版本。如果这里没有显示你装的JDK,点Add JDK手动添加路径。Java版本下拉框一般会自动匹配JDK版本。

2.2 依赖到底勾哪几个:新手推荐组合与含义

到了Dependencies这一步,很多人会懵,一堆依赖名看得眼花缭乱。其实完全不用慌,初期只需要勾这几个:

依赖作用我的建议
Spring Web提供Tomcat内嵌服务器、Spring MVC、REST接口支持,是所有Web项目的核心必选
Spring Boot DevTools热部署工具,改了代码自动重启强烈建议勾上
Lombok通过注解省略getter/setter/构造器代码,让实体类干净很多强烈建议勾上
Spring Configuration Processor写配置文件时有自动提示和校验建议勾上
Thymeleaf服务端渲染模板引擎做纯后端API的话不勾,做页面渲染再勾
Spring Data JPA / MyBatis数据持久层框架新手阶段可以先不选,后面用到再手动加依赖

这其实是很多人不知道的细节:Spring Initializr只是生成模版项目,之后你可以随时在pom.xml里手动加依赖。所以创建项目时少勾两个依赖完全不是问题,勾错了也不影响什么。但Spring Web这个千万别漏了,漏了你就只能在控制台打Hello World了,浏览器根本访问不到。

2.3 项目生成后的目录结构,每层是干嘛的

点击Finish后,IDEA会拉取项目依赖并构建目录。第一次构建可能需要几分钟,进度条一直在转,这是Maven在从中央仓库下载依赖。如果你的网络状态不好,这一步可能报错,解决方案我在第4节专门说。

构建完成后,整个项目的结构长这样:

my-springboot-app/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/myproject/ │ │ │ ├── MySpringbootAppApplication.java │ │ │ └── ... │ │ └── resources/ │ │ ├── application.properties(或application.yml) │ │ ├── static/ │ │ ├── templates/ │ │ └── ... │ └── test/ │ └── java/ │ └── ... ├── .mvn/ ├── mvnw / mvnw.cmd ├── pom.xml └── .gitignore

MySpringbootAppApplication.java是启动类,里面有main方法,运行它就等于启动了整个SpringBoot应用。application.properties是配置文件,不过我个人强烈建议你把它改成application.yml,YAML格式的层级结构更清晰,写复杂配置时可读性高得多。pom.xml是Maven的配置文件,所有依赖都写在这里。

到这里项目创建完毕。下一步就是运行起来。

3. 从启动类到第一个接口:把项目跑起来

3.1 @SpringBootApplication背后的组合魔法

新建的启动类上有@SpringBootApplication注解,就这一行注解,背后做了一大堆事情。它其实是三个注解的合成体:

  • @SpringBootConfiguration:标记这是Spring Boot的配置类,继承自@Configuration。告诉Spring容器“这个类里有Bean定义”。
  • @EnableAutoConfiguration:这是SpringBoot的核心魔法。它根据你pom.xml里引入的依赖,自动帮你配好大量默认的Bean。比如你引入了spring-boot-starter-web,它就自动配置好DispatcherServlet、Tomcat内嵌服务器、Jackson消息转换器等等。省去了传统Spring项目中一大堆XML配置或@Configuration类。
  • @ComponentScan:默认扫描启动类当前包及其子包下的所有@Component、@Service、@Controller、@Repository等注解类,把它们注册进Spring容器。

如果你启动类所在的包名是com.example.myproject,那么你新加的Controller放在com.example.myproject.controller下面就能被扫描到。如果你把Controller放到com.example.other包下,那就扫描不到,访问接口时直接404。这个坑我见过太多次了,特别是从别的项目里复制代码过来时,包名对不上就出问题。

3.2 写一个Controller,验证项目是真的通了

创建项目后第一件事,不是写业务代码,而是先写一个测试接口,验证项目能正常启动并响应请求。打开启动类,右键点击main方法选择Run。IDEA底部控制台开始刷日志,等几秒你看到类似这样的输出:

Tomcat started on port(s): 8080 (http) with context path '' Started MySpringbootAppApplication in 2.3 seconds (process running)

看到这行,项目启动成功了。这行日志的意思是你的内嵌Tomcat监听在8080端口,Spring容器初始化完成,用了2.3秒。此时你打开浏览器输入http://localhost:8080,大概率看到的是一个默认的错误页面(因为没有配置任何接口),这是正常的。

现在我们来写第一个接口。在启动类同级的包下新建一个controller包,然后在里面创建HelloController.java:

package com.example.myproject.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello, Spring Boot!"; } }

@RestController表示这是一个处理HTTP请求的控制器,并且返回值直接写入响应体,不做视图渲染。@GetMapping("/hello")表示当浏览器访问/hello路径的GET请求时,执行这个方法。保存文件后,如果你的IDEA装了DevTools,项目会自动重启。没装的话你手动重启一下。然后在浏览器访问http://localhost:8080/hello,看到Hello, Spring Boot!就说明一切正常了。

3.3 application.yml配置:端口、上下文路径与日志

application.properties或application.yml是SpringBoot的配置文件,里面可以修改端口、数据库地址、日志级别等等。我每次新建项目都会先把几个基础配置写上,省得后续开发时来回查:

server: port: 8080 servlet: context-path: /api spring: application: name: my-springboot-app logging: level: root: info com.example.myproject: debug

server.port把端口改成其他值(比如8081)可以避免本机端口冲突。context-path设置一个统一前缀,这样接口地址就变成了http://localhost:8080/api/hello。logging.level把指定路径下日志级别设为debug,开发阶段能看到更详细的SQL和调试信息,排查问题方便很多。

这里提醒一句:application.yml对缩进非常敏感,YAML格式靠缩进区分层级,不能用Tab键缩进,要用空格。IDEA默认帮你处理好了,但是如果你从其他地方复制配置过来,容易混入Tab,导致启动时报java.util.Scanner异常或解析错误。如果遇到启动报配置文件相关的错误,先检查YAML缩进。

4. 创建项目时最常见的几个坑,一次说透

4.1 SpringBoot版本太高导致Jar包冲突和编译失败

2023年的SpringBoot已经出到了3.1、3.2版本,很多人在Initializr里直接选了最新版,结果项目一创建,Maven同步依赖时报错,或者IDE里依赖列表一堆红波浪线。这不是IDEA的问题,大多数情况是版本和JDK不匹配。SpringBoot 3.x是2022年11月发布的大版本,它基于Jakarta EE 9,包名从javax.*改成了jakarta.*,并且强制要求JDK 17及以上。如果你本机装的是JDK 8或11,拿一个SpringBoot 3.x项目去跑,启动时会直接报UnsupportedClassVersionError或者一堆ClassNotFoundException。

怎么处理?如果你用的是JDK 8或11,创建项目时在Spring Initializr界面把SpringBoot版本切换到2.7.x系列,这是2.x的最终维护版本,稳定且兼容JDK 8/11。如果你确实想用SpringBoot 3.x体验最新特性,那先把JDK升到17再说。实际操作中我建议你不要执着于最新版,稳定压倒一切。3.x发布初期,很多第三方starter还没适配jakarta.*命名空间,你连MyBatis都得用专门的mybatis-spring-boot-starter版本才能兼容。如果不是跟着教程走且教程明确要求3.x,默认用2.7.x更稳。

版本改动是怎么操作的呢?在IDEA右侧Maven面板展开Lifecycle,执行clean和compile前先改pom.xml里的版本号:

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> </parent>

改成2.7.18后保存,Maven会自动重新解析依赖。这是最直接、也最不容易出问题的方式。

4.2 Maven依赖下载慢和下载失败,本地仓库配置

Maven首次加载SpringBoot依赖时,如果长时间卡住或者直接报Cannot resolve ...的错误,十有八九是网络问题。Maven默认从中央仓库下载,国内访问速度很不稳定。解决办法是配置阿里云镜像仓库。打开IDEA,进入Settings -> Build, Execution, Deployment -> Build Tools -> Maven,找到User settings file对应的settings.xml(没有的话自己建一个),把这段配置加进去:

<mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>central</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors>

mirrorOf设为central表示所有中央仓库的请求都走阿里云镜像。配置完点Apply,然后重新加载Maven项目,速度提升非常明显。如果你在IDEA里改了settings.xml不生效,注意Maven的Local repository路径和User settings file路径必须是同一个配置文件,别在IDEA里指来指去指错了。

4.3 端口被占用:8080起不来怎么办

SpringBoot默认端口是8080,如果你本机其他程序占了8080端口(比如之前启动过其他服务没关掉),启动时报错会看到:

Web server failed to start. Port 8080 was already in use.

这时候分两步排查。第一步,找到是谁占用了端口。Windows在命令行输入netstat -ano | findstr 8080,macOS/Linux输入lsof -i :8080,找到占用进程的PID,然后根据实际情况关掉它,或者直接改SpringBoot端口。第二步,不排查了,直接改端口。在application.yml里设置server.port: 8081,重启就完事。

我个人建议开发阶段直接用随机端口,比如server.port: 0,这样每次启动都会自动分配一个空闲端口,IDEA控制台日志会告诉你实际端口。但这样有个缺点:访问地址飘忽不定。所以还是固定端口更实用,只是要注意本机端口规划。

5. 提高效率的技巧:工具与扩展

5.1 Lombok省掉重复代码

刚才创建项目时建议勾选Lombok,现在就来看看它省了什么。Java实体类通常要写一堆getter/setter/toString,Lombok通过注解在编译期自动生成这些方法,代码量减少一半以上。比如:

package com.example.myproject.entity; import lombok.Data; @Data public class User { private Long id; private String name; private String email; }

@Data注解编译后自动生成所有字段的getter、setter、toString、equals和hashCode方法。代码里直接写user.getName()就行,完全不用手写这些样板代码。除了@Data,常用的还有@Slf4j(生成日志对象log)、@Builder(建造者模式)、@AllArgsConstructor(全参构造器)。不过注意,用Lombok的时候IDEA必须安装Lombok插件(新版IDEA已内置),并且在Settings -> Build -> Compiler -> Annotation Processors里勾选Enable annotation processing,否则编译时Lombok注解不生效,你会看到一堆“找不到符号getXxx”的错误。

5.2 DevTools热部署:改代码不用反复重启

DevTools是SpringBoot提供的开发期热部署工具,原理是监听classpath文件变化,变化后自动重启应用。实测下来比手动重启快不少,特别是在项目慢慢变大之后。配置完成后,每次你修改Controller、Service里的代码并保存,控制台就会自动触发重启,整个过程大概2到3秒,省去手动切窗口点重启按钮的时间。

也有人会说“DevTools一直重启很烦”,那是因为你频繁改配置文件。DevTools对classpath里的文件变化是重新加载,对静态资源(HTML、CSS、JS)则只做浏览器刷新不做重启,两种策略不一样。如果你只是想改前端页面就自动刷新,需要在application.yml里配置:

spring: devtools: livereload: enabled: true

我个人的配置习惯是:写后端逻辑时开DevTools自动重启,写前端页面时关掉重启、用浏览器插件配合livereload。实际项目中我更多是开着DevTools,代码保存即生效,效率提升很明显。

5.3 Spring Boot Banner:给你的启动界面加个定制皮肤

这是个小彩蛋。每次SpringBoot启动时控制台都会打印一个ASCII艺术字体的“Spring”横幅。这个横幅其实是可以定制的。你可以到src/main/resources目录下新建一个banner.txt文件,把你想显示的ASCII字符画放进去,启动时它就会覆盖默认的Spring Banner。网上有专门的Spring Boot Banner生成器,可以输入文字自动生成ASCII艺术字。甚至如果你想优雅地隐藏横幅,在application.yml里写spring.main.banner-mode: off就能关闭。这个功能虽然不影响业务逻辑,但团队项目里加上一个项目名称横幅,启动时视觉上会专业很多。

6. 项目扩展的下一步建议

创建并跑通第一个SpringBoot项目只是起点。接下来你有几个明确的方向值得探索。

第一个是整合数据库。先加一个MySQL驱动和JPA或MyBatis依赖,配置好数据源,写一个实体类、一个Repository或Mapper接口,体验一下ORM的便捷。这里我建议新手先试Spring Data JPA,因为它几乎不用写SQL就能实现基础CRUD。第二步是写一个RESTful接口,把数据通过JSON格式返回给前端,配合@RestControllerAdvice实现统一异常处理,让接口更健壮。然后再做统一响应体封装(比如返回{"code": 200, "data": ..., "message": "success"}),这个阶段你会真正理解前后端如何通过约定格式对接。

第三件事是学会单元测试。SpringBoot对测试支持很完善,spring-boot-starter-test里有JUnit、Mockito等全套工具。不要觉得写测试是浪费时间,等你改完代码发现接口行为变了、系统自动报错的时候,就知道测试的价值了。第四件值得做的事是尝试用IDEA的Docker集成插件把项目打包成Docker镜像,体验一次“一次构建、到处运行”的工作流。

如果你要做前后端分离项目,IDEA里创建SpringBoot项目后,前端用Vue或React单独建立项目,通过HTTP请求调用后端接口,注意处理跨域问题(在Controller上加@CrossOrigin或在配置类里注册CorsFilter)。这个开发模式是目前市面上最常见的全栈开发范式,你现在创建的SpringBoot项目日后完全可以长成那个形态。

6.1 从SpringMVC工程迁移到SpringBoot的快捷思路

我之前接过一些老项目,代码是用传统的SpringMVC+XML配置写的。把它们改造成SpringBoot,不用重写业务代码,关键是处理好下面四点:

  • web.xml里配置的DispatcherServlet、ContextLoaderListener全部删除,SpringBoot的自动配置会搞定这些。
  • Spring的XML配置文件中<mvc:annotation-driven/>、<context:component-scan>这些标签换成对应的@Configuration类或@ComponentScan注解。
  • applicationContext.xml里的数据源、事务管理器、MyBatis配置,按SpringBoot的风格改写成application.yml数据源配置,MyBatis直接引入mybatis-spring-boot-starter。
  • JSP视图层如果还继续用,需要加spring-boot-starter-tomcat并调整目录结构,而如果你用的是模板引擎(Thymeleaf、FreeMarker),替换起来就自然很多。

大部分老工程的Service和Controller代码可以原封不动搬过来,真正要动的只是配置和依赖部分。改造完后你会发现项目清爽得多,没有几十行XML要维护了。

7. 最后的几点碎碎念

整个创建SpringBoot项目的流程,看起来就是点几下鼠标、写一个Controller,但背后涉及了Maven坐标、依赖管理、自动配置、内嵌服务器等多个概念体系。新手阶段不要求全部理解,先把流程跑通、把“项目能启动、接口能访问”这个正循环建立起来,后面再逐个概念深入理解,学习成本会低很多。我自己带过不少新人,凡是能顺利把第一个项目跑起来的,后面学注解、学依赖注入、学数据库整合,进度都会快得多。

有一个习惯我特别推荐:每次新建项目,把pom.xml文件的依赖梳理一遍,搞清楚这个依赖是干什么用的,是从哪个传递依赖被带进来的。用Maven面板里的Dependencies视图,可以看到依赖树。这一步能把你从“复制粘贴pom”的状态中解放出来。我自己也是这么过来的,依赖管理理解了,Maven就基本掌握了,SpringBoot项目的构建逻辑也随之清晰。

最后,如果你已经成功跑起来了这个示例项目,把启动类、Controller、配置文件这三样内容作为你继续探索SpringBoot世界的基础。后面无论是读源码还是做项目,这三块是你每一次都会遇到的核心骨架。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询