spring-boot-starter-web 不是必须选,但 http 服务场景下是起点;不选则无内嵌 tomcat、@restcontroller 支持及默认端口监听,易出现 whitelabel 错误或端口未监听。

用 Spring Initializr 创建项目时,spring-boot-starter-web 是不是必须选?
不是必须,但绝大多数 HTTP 服务场景下它就是起点。不选它,SpringApplication.run() 能启动,但没内嵌 Tomcat、没 @RestController 支持、curl http://localhost:8080 直接连不上。
常见错误现象:Whitelabel Error Page 或启动后无任何端口监听(netstat -an | grep 8080 空)——大概率是漏了 web starter 或选了 spring-boot-starter-reactive-web 却写传统 MVC 代码。
- 纯批处理、定时任务、消息消费者项目可以只选
spring-boot-starter+spring-boot-starter-quartz或spring-boot-starter-amqp - 想用 WebFlux 写响应式接口,得选
spring-boot-starter-webflux,此时再引入spring-boot-starter-web会触发容器冲突(两个 Servlet WebServer 和 Netty WebServer 共存) -
spring-boot-starter-web默认带tomcat-embed-core;如需 Jetty,要排除 Tomcat 并显式加spring-boot-starter-jetty
pom.xml 里 spring-boot-starter-parent 的 version 怎么选?
直接看 start.spring.io 页面顶部显示的推荐版本,别手动填 3.2.0 这类具体号——Spring Boot 版本和底层 Spring Framework、Jackson、Hibernate 等组件有严格兼容矩阵,父 POM 就是干这个的。
容易踩的坑:spring-boot-starter-parent 版本和你本地 mvn -v 的 Maven 版本不匹配。Spring Boot 3.x 要求 Maven ≥ 3.8.1;用 3.6.x 会出现 Could not resolve placeholder 类错误,因为属性解析机制变了。
- IDEA 新建项目时勾选 “Use project SDK” 和 “Add sample code”,能避免空骨架导致的
ClassNotFoundException - 如果公司私有仓库镜像没同步新版本,
mvn dependency:resolve会卡在spring-boot-dependencies,此时要确认 Nexus/Artifactory 是否代理了https://repo.spring.io/release - 不要手动改
<version></version>标签覆盖父 POM 的依赖版本,比如强行把spring-boot-starter-data-jpa降到 2.7.x —— JPA 接口签名可能已变,编译过、运行崩
生成的 src/main/resources/application.properties 为什么默认为空?
因为 Spring Boot 2.4+ 启用了新的配置加载机制:application.properties 不再是唯一入口,application.yml、config/application.properties、环境变量、JVM 参数都参与排序。空文件只是占位,不代表没配置。
实际使用中,多数人第一件事是加这三行:
server.port=8080 spring.application.name=demo-service logging.level.com.example.demo=DEBUG
但要注意:server.port 在 Docker 容器里常被覆盖为 8080,而 Kubernetes Service 可能要求固定端口,这时得用 server.port=${PORT:8080} 配合环境变量注入。
- 中文注释在
.properties文件里必须用 Unicode 转义(\u4F60\u597D),否则启动报Invalid byte 2 of 3-byte UTF-8 sequence -
application.yml更适合多层级配置(如数据库连接池),但缩进必须用空格,不能用 Tab —— YAML 解析器会直接抛while scanning for the next token - Profile-specific 配置如
application-dev.properties,必须通过--spring-profiles-active=dev或spring.profiles.active=dev显式激活,不会自动加载
为什么 mvn clean package 出来的 jar 包不能直接 java -jar 运行?
大概率是 pom.xml 没声明 spring-boot-maven-plugin,或者插件配置里漏了 <executions></executions> 绑定到 package 生命周期。
标准写法长这样(Spring Boot 3.x):
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
没这段,mvn package 输出的是普通 jar(MANIFEST.MF 里没有 Start-Class 和 Spring-Boot-Classes),java -jar 会报 no main manifest attribute。
- 插件默认会把依赖打成 fat jar;若想拆分成 lib 目录 + 启动脚本,得配
<layout>ZIP</layout>并启用repackagegoal - 用 IDEA 的 “Maven → Lifecycle → package” 图形界面打包,有时会跳过插件执行(尤其在多模块项目里),务必在终端敲
mvn clean package - Windows 下用
cmd打包后,在 Git Bash 里运行java -jar可能因路径分隔符出错,建议统一用 PowerShell 或 WSL
依赖结构不是树状图,而是由 Starter 封装的契约——你看到的 spring-boot-starter-data-jpa 本身不写一行 JDBC 代码,它只规定“只要你在 classpath 里放了 Hibernate,我就自动配好 DataSource 和 JpaTransactionManager”。真要调底层,得看 Starter 的 spring.factories 和自动配置类,而不是翻它的 pom。










