启动项目时报"Port already in use",这是新人最常遇到的报错之一。原因很简单:你要用的端口被别的程序占了。这节教你2种快速解决方法。
一、为什么会端口被占用
常见原因:
| 原因 | 说明 |
|---|---|
| 之前启动的没关 | 上次启动的SpringBoot/Redis/MySQL没正常关闭 |
| 多个项目抢同一端口 | 两个项目都用8080 |
| 其他软件占用 | 某些软件默认用8080 |
| 系统服务占用 | Windows的一些服务可能占了常见端口 |
二、方法1:杀掉占用端口的进程
步骤1:查看谁占用了端口
Windows命令行:
Shell
# 查看端口占用(以8080为例)
netstat -ano | findstr 8080
输出:
TEXT
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 12345
TCP [::]:8080 [::]:0 LISTENING 12345
最后一列12345就是占用端口的进程PID。
步骤2:查看是什么程序
Shell
# 查看PID对应的进程
tasklist | findstr 12345
输出:
TEXT
java.exe 12345 Console 1 300,000 K
可以看到是java.exe,大概率是你之前启动的SpringBoot。
步骤3:杀掉进程
命令行杀:
Shell
# 强制杀掉
taskkill /PID 12345 /F
/F表示强制终止。
任务管理器杀:
- Ctrl+Shift+Esc打开任务管理器
- 详细信息标签 → 找到PID 12345
- 右键 → 结束任务
步骤4:重新启动
端口释放了,重新启动项目就行了。
一键脚本
写个bat脚本,以后端口被占了一键解决:
bat
@echo off
set /p PORT=请输入端口号:
echo 正在查找占用端口 %PORT% 的进程...
for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%PORT% " ^| findstr "LISTENING"') do (
echo 找到进程 PID: %%a
tasklist | findstr %%a
set /p CONFIRM=是否杀掉此进程?(Y/N):
if /i "!CONFIRM!"=="Y" (
taskkill /PID %%a /F
echo 进程已终止
)
)
pause
存成kill-port.bat,双击运行,输入端口号就能杀掉占用进程。
三、方法2:换一个端口
不想杀进程,或者不确定能不能杀,那就换端口。
SpringBoot换端口
方法1:改配置文件
YAML
server:
port: 8081 # 换成8081或其他没被占用的端口
方法2:启动参数指定
IDEA运行配置 → Program arguments:
TEXT
--server.port=8081
方法3:环境变量
IDEA运行配置 → Environment variables:
TEXT
SERVER_PORT=8081
方法4:命令行启动时指定
Shell
java -jar my-project.jar --server.port=8081
Vue前端换端口
Vite项目 — vite.config.js:
JavaScript
export default defineConfig({
server: {
port: 3001 // 换端口
}
})
Vue CLI项目 — vue.config.js:
JavaScript
module.exports = {
devServer: {
port: 3001
}
}
Redis换端口
配置文件redis.windows.conf:
TEXT
port 6380 # 换成6380
MySQL换端口
配置文件my.ini:
ini
[mysqld]
port=3307 # 换成3307
改完要重启服务。
四、常用端口及冲突排查
| 端口 | 常用服务 | 冲突时怎么办 |
|---|---|---|
| 80 | HTTP/Nginx | 换8080或8081 |
| 443 | HTTPS | 换8443 |
| 3306 | MySQL | 换3307 |
| 6379 | Redis | 换6380 |
| 8080 | Tomcat/SpringBoot | 换8081 |
| 8848 | Nacos | 换8849 |
| 9090 | 各种Web服务 | 换9091 |
| 3000 | Vue/React前端 | 换3001 |
批量检查端口
Shell
# 一次性检查多个端口
netstat -ano | findstr "8080 3306 6379 8848"
五、常见场景
场景1:SpringBoot启动报8080被占
TEXT
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 by using the server.port property.
解决: 按方法1杀掉占用进程,或者按方法2换端口。
场景2:Redis启动报6379被占
Shell
# 查看占用
netstat -ano | findstr 6379
# 通常是之前的Redis没关
taskkill /PID 12345 /F
场景3:IDEA端口被占但找不到进程
有时候netstat查不到,可能是IDEA内部的Tomcat没释放。
解决:
- 关掉IDEA里所有运行中的项目
- 重启IDEA
- 还不行的话重启电脑
场景4:Windows服务占用了端口
某些Windows服务(如IIS)会占用80端口。
Shell
# 查看占用80端口的
netstat -ano | findstr :80
如果是System进程(PID 4),是IIS或HTTP.sys服务:
Shell
# 停止IIS
iisreset /stop
# 或者禁用HTTP服务(需要管理员权限)
sc config http start= disabled
场景5:Docker容器端口冲突
Docker容器和本地服务端口冲突。
Shell
# 查看Docker容器端口映射
docker ps
# 停掉冲突的容器
docker stop 容器名
# 或重新运行时换端口
docker run -p 6380:6379 redis
六、预防端口冲突
1. 规划端口
提前规划好每个服务用什么端口,避免冲突:
TEXT
后端SpringBoot:8080
前端Vue:3000
MySQL:3306
Redis:6379
Nacos:8848
RabbitMQ:5672
2. 启动前检查
养成习惯,启动服务前先检查端口:
Shell
netstat -ano | findstr "你要用的端口"
没有输出就说明端口没被占用。
3. 正常关闭服务
用IDEA的停止按钮或Ctrl+C正常关闭,不要直接关窗口。
正常关闭会释放端口,强制关窗口可能导致端口没释放。
小结
| 方法 | 操作 | 适用场景 |
|---|---|---|
| 杀进程 | netstat查PID → taskkill | 明确是什么程序占的 |
| 换端口 | 改配置文件/启动参数 | 不确定能不能杀,或懒得杀 |
优先用方法1杀进程,不想杀就方法2换端口。两个方法30秒搞定。