











最后更新:2026-07-31
适用场景:Spring Boot 启动失败、8080 端口被占用、Port 8080 was already in use、Web server failed to start、Windows / Linux / macOS 查看端口占用、修改 server.port
Spring Boot 项目启动时,如果控制台出现下面这种报错:
Web server failed to start. Port 8080 was already in use.
或者:
Port 8080 was already in use.
基本可以确定:当前项目想使用 8080 端口,但这个端口已经被别的进程占用了。
这个问题很常见,尤其是本地开发时:
上一个 Spring Boot 项目没关
IDEA 里重复启动了两次
另一个服务也用了 8080
Docker 容器占用了端口
本机装了 Tomcat / Nginx / 其他 Java 服务
这个报错本身不复杂,处理思路也很简单:
要么关掉占用端口的进程;
要么让当前 Spring Boot 项目换一个端口。
常见完整报错类似这样:
***************************
APPLICATION FAILED TO START
***************************
Description:
Web server failed to start. Port 8080 was already in use.
Action:
Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
这段提示已经把解决方向说得很清楚:
1. 找到占用 8080 端口的进程,并停止它
2. 或者把当前应用改成其他端口
本地开发时,不要一看到这个报错就去改代码。先判断一下:
这个 8080 端口到底是谁占用了?
如果你只是想让项目先跑起来,最快的办法是改端口。
在 application.yml 里加:
server:
port: 8081
或者在 application.properties 里加:
server.port=8081
然后重新启动项目。
如果 8081 也被占用,可以换成:
8082
8090
9000
10000
开发环境下,端口号不是固定不能改的。只要你前端、接口文档、回调地址同步调整即可。
不要所有情况都直接杀进程。
我一般这样判断:
| 情况 | 建议处理 |
|---|---|
| 之前启动的同一个项目没关 | 杀掉旧进程 |
| IDEA 里重复启动了同一个服务 | 停掉多余运行实例 |
| 另一个项目正常使用 8080 | 当前项目换端口 |
| Docker 容器占用 8080 | 停容器或改映射端口 |
| 本机 Tomcat 占用 8080 | 停 Tomcat 或换 Spring Boot 端口 |
| 公司项目约定必须用 8080 | 找出占用进程并关闭 |
| 本地多个服务同时开发 | 每个服务分配固定端口 |
一句话:
端口被自己遗留进程占了,就关掉它;
端口被正常服务占了,就换当前项目端口。
Windows 上可以用 netstat 查。
打开 CMD 或 PowerShell,执行:
netstat -ano | findstr :8080
如果端口被占用,可能会看到:
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 12345
最后一列:
12345
就是进程 PID。
然后查看这个 PID 是什么程序:
tasklist | findstr 12345
可能输出:
java.exe 12345 Console
说明是某个 Java 进程占用了 8080。
如果确认这个进程可以关闭,可以执行:
taskkill /PID 12345 /F
其中:
12345 替换成你查到的 PID
例如:
taskkill /PID 12345 /F
执行后再启动 Spring Boot 项目。
注意:不要看到 java.exe 就无脑杀。你的电脑上可能有多个 Java 程序正在运行。最好先确认是不是你刚才启动过的旧项目。
如果不习惯命令行,也可以这样:
Ctrl + Shift + Esc 打开任务管理器
切换到“详细信息”
找到对应 PID
确认进程名称
右键结束任务
如果任务管理器没显示 PID,可以在“详细信息”页右键表头,勾选:
PID
本地开发时,最常见的情况就是 IDEA 里项目没停干净,后台还留着一个 java.exe。
Linux 上常用:
lsof -i :8080
输出类似:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 12345 root 88u IPv6 12345 0t0 TCP *:8080 (LISTEN)
这里的 PID 是:
12345
也可以用:
netstat -tunlp | grep 8080
如果系统没有 netstat,可以用:
ss -tunlp | grep 8080
确认可以结束后:
kill 12345
如果普通 kill 不生效,再用:
kill -9 12345
不建议一上来就 kill -9。
kill -9 是强制结束,服务没有机会优雅释放资源。
更稳一点:
kill 12345
sleep 2
lsof -i :8080
如果还在,再考虑:
kill -9 12345
macOS 和 Linux 类似。
查看 8080:
lsof -i :8080
只看监听状态:
lsof -nP -iTCP:8080 | grep LISTEN
结束进程:
kill 12345
强制结束:
kill -9 12345
这是最常见的本地开发场景。
你点了一次运行按钮,项目已经启动。
后来又点了一次运行,新的进程也想用 8080,于是报错。
处理方式:
1. 看 IDEA 底部 Run 窗口
2. 停掉旧的运行实例
3. 再重新启动
如果你开了多个 Run 标签,注意每个标签都可能是一个正在运行的服务。
也可以在 IDEA 右上角的运行配置旁边点停止按钮。
如果 IDEA 里看不到,但端口还被占用,就用命令查 PID。
server:
port: 8081
server.port=8081
这就是最常见的改端口方式。
如果项目里有多个环境配置,比如:
application.yml
application-dev.yml
application-test.yml
application-prod.yml
要注意端口可能写在不同文件里。
例如:
# application-dev.yml
server:
port: 8081
如果你改了 application-dev.yml,但实际启动时没有激活 dev 环境,那么端口配置不会生效。
不想改配置文件,也可以启动时临时指定:
java -jar demo.jar --server.port=8081
IDEA 里也可以在 Program arguments 中加:
--server.port=8081
这样只对本次启动生效。
适合临时测试:
同一个项目启动多个实例
本地同时跑多个服务
不想改配置文件
有些部署环境会用环境变量。
Linux / macOS:
export SERVER_PORT=8081
java -jar demo.jar
Docker:
docker run -e SERVER_PORT=8081 demo-app
Spring Boot 可以把环境变量映射到配置属性。
SERVER_PORT 对应:
server.port
这种方式适合容器部署或云平台部署。
如果只是测试,不关心具体端口,可以写:
server:
port: 0
这样 Spring Boot 会随机分配一个可用端口。
启动日志里会看到实际端口,例如:
Tomcat started on port 53421
这种方式适合:
测试环境
集成测试
本地临时启动多个实例
不适合正式接口服务,因为前端或调用方不知道你实际端口是多少。
如果你已经写了:
server:
port: 8081
但启动还是占用 8080,先查这几个地方:
1. 配置文件是不是 application.yml / application.properties
2. yml 缩进是否正确
3. 是否改错了环境文件
4. spring.profiles.active 是否激活了对应环境
5. 启动参数里是否又指定了 --server.port=8080
6. 环境变量里是否有 SERVER_PORT=8080
7. IDEA 运行配置里是否写了旧端口
配置优先级不同,后面的启动参数、环境变量可能会覆盖配置文件。
例如你配置文件写:
server:
port: 8081
但启动命令是:
java -jar demo.jar --server.port=8080
那最终仍然会用 8080。
Docker 场景有两层端口:
容器内端口
宿主机端口
例如:
docker run -p 8080:8080 demo-app
意思是:
宿主机 8080 -> 容器 8080
如果宿主机 8080 已经被占用,这个命令会失败。
可以改成:
docker run -p 8081:8080 demo-app
意思是:
宿主机访问 8081
转发到容器里的 8080
这时 Spring Boot 容器内部仍然可以用 8080,但外部通过 8081 访问。
如果想改 Spring Boot 自身端口,可以:
docker run -e SERVER_PORT=8081 -p 8081:8081 demo-app
docker-compose.yml 示例:
services:
demo-app:
image: demo-app:latest
ports:
- "8081:8080"
这里表示:
宿主机 8081 -> 容器 8080
如果写成:
ports:
- "8080:8080"
而宿主机 8080 已经被占用,就会启动失败。
本地开发多个 Spring Boot 容器时,建议这样分配:
services:
user-service:
ports:
- "8081:8080"
order-service:
ports:
- "8082:8080"
product-service:
ports:
- "8083:8080"
这样容器内部都可以使用 8080,宿主机端口不同。
本机如果安装过 Tomcat,默认也可能用 8080。
检查方式仍然是:
netstat -ano | findstr :8080
或者 Linux/macOS:
lsof -i :8080
如果确认是 Tomcat:
Windows:停止 Tomcat 服务
Linux:停止对应 Tomcat 进程
如果 8080 是 Nginx、网关或其他服务正常使用的端口,那就不要关它,直接让 Spring Boot 换端口。
本地做微服务或多模块项目时,不要都用 8080。
可以约定:
网关服务:8080
用户服务:8081
订单服务:8082
商品服务:8083
后台服务:8088
管理端接口:8090
配置示例:
server:
port: 8082
最好在 README 里写清楚:
user-service: 8081
order-service: 8082
product-service: 8083
否则团队协作时很容易冲突。
大多数情况下没关系。
无论是 Spring Boot 2、Spring Boot 3 还是 Spring Boot 4,只要内嵌 Web 容器启动时端口被占用,就会报类似错误。
但如果你升级了 Spring Boot 版本后突然出现端口问题,可能是因为:
配置文件没生效
profile 改了
server.port 被覆盖
启动脚本变了
Docker 映射变了
IDEA 运行配置变了
如果是 Spring Boot 2 升级 3,可以顺便检查:
一般也没关系。
不过如果你启动了多个不同 JDK 的 Java 进程,比如:
一个 JDK8 项目占用 8080
一个 JDK17 项目也想用 8080
那么后启动的项目还是会失败。
这时查端口时看到的可能都是:
java.exe
所以要根据 PID 判断具体是哪一个 Java 进程。
如果你有 JDK 版本混乱问题,可以看:
server:
port: 8081
适合:
只是本地端口冲突
另一个服务需要继续运行
想快速启动当前项目
Windows:
netstat -ano | findstr :8080
taskkill /PID 12345 /F
Linux/macOS:
lsof -i :8080
kill 12345
适合:
旧项目没关
重复启动
确认进程可以关闭
重点检查:
application.yml
application-dev.yml
启动参数
环境变量
IDEA Program arguments
Docker 环境变量
Docker 端口映射
适合:
明明改了 server.port,但启动还是 8080
遇到端口被占用,按下面顺序查:
1. 看报错里写的是哪个端口
2. 判断是本地运行还是 Docker 部署
3. Windows 用 netstat -ano 查 PID
4. Linux/macOS 用 lsof 或 ss 查进程
5. 确认占用进程能不能关闭
6. 如果能关,就结束进程
7. 如果不能关,就修改 server.port
8. 检查 application.yml 缩进
9. 检查 profile 是否激活
10. 检查启动参数是否覆盖端口
11. 检查环境变量 SERVER_PORT
12. 检查 IDEA 运行配置
13. 检查 Docker 端口映射
14. 重新启动项目
意思是 8080 端口已经被其他进程占用了,当前 Spring Boot 项目不能再绑定这个端口。
Windows:
netstat -ano | findstr :8080
Linux/macOS:
lsof -i :8080
Windows:
taskkill /PID 进程ID /F
Linux/macOS:
kill 进程ID
如果普通 kill 不生效,再考虑:
kill -9 进程ID
application.yml:
server:
port: 8081
application.properties:
server.port=8081
常见原因:
改错配置文件
profile 没激活
启动参数覆盖了配置
环境变量覆盖了配置
IDEA 运行配置里写了旧端口
Docker 映射端口没改
不一定。
如果占用 8080 的服务本来就需要运行,那就不要杀它,改当前项目端口更合适。
如果宿主机 8080 被占用,可以改映射:
docker run -p 8081:8080 demo-app
表示访问宿主机 8081,转发到容器 8080。
不能在同一台机器上同时监听同一个端口。
可以分配:
8081
8082
8083
8088
8090
Spring Boot 端口被占用,不是代码逻辑问题,基本就是端口冲突。
处理方式只有两个:
关闭占用端口的进程
或者修改当前项目端口
本地开发时,我更建议先查:
netstat -ano | findstr :8080
或者:
lsof -i :8080
确认到底是谁占用了端口。
如果只是旧项目没关,杀掉进程即可。
如果是另一个正常服务在用 8080,那就把当前项目改成:
server:
port: 8081
不要为了启动一个项目,随手关掉不该关的服务。
Spring Boot DataSource 报错:
Spring Boot 接收 JSON 参数:
Spring Boot 与 JDK 兼容:
Spring Boot 2 升级 3:
Java 开发环境配置:
2026-07-31:
- 创建 Spring Boot 端口被占用处理文章
- 增加 Windows / Linux / macOS 查看端口占用方法
- 增加修改 server.port、启动参数、环境变量方式
- 增加 Docker / Docker Compose 端口映射说明
- 增加 IDEA 重复启动、profile 配置不生效等常见场景
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。