1. 概述

在 Java 开发中,启动 Tomcat 时遇到 java.net.BindException: Address already in use 是一个非常常见的问题。本文将深入分析该异常的成因,并提供几种简单粗暴但有效的解决方案,帮助你在踩坑后快速恢复。

2. 异常触发场景

Tomcat 默认使用 8080 端口提供 HTTP 服务。而操作系统中,一个端口在同一时间只能被一个进程占用

当你遇到这个错误时,通常意味着:

✅ 有另一个进程正在占用目标端口(比如之前的 Tomcat 实例未正常关闭)
✅ 或者你本地运行了其他服务(如 Spring Boot 内嵌 Tomcat、Nginx、Node.js 服务等)占用了该端口

⚠️ 注意:即使你关闭了 IDE 或命令行窗口,后台进程可能仍在运行,这就是典型的“假关闭”导致的端口冲突。

3. 诊断与解决方案

解决思路无非两种:

  • ✅ 更换服务端口
  • ✅ 终止占用端口的进程

下面分别介绍具体操作。

3.1 定位端口占用进程

我们需要先查清楚是哪个“罪魁祸首”占用了 8080 端口。

Windows 系统

使用 netstat 查看端口占用情况:

netstat -ano | find "8080"

输出示例:

TCP    0.0.0.0:8080    0.0.0.0:0    LISTENING    21376

其中 21376 是占用该端口的进程 PID(Process ID)。

Linux / Unix 系统

netstat -pant | grep "8080"

输出示例:

tcp6  0  0 :::8080  :::*  LISTEN  21376/java

同样可以拿到 PID。

macOS 系统

macOS 推荐使用 lsof 命令,更简洁:

lsof -t -i :8080

输出:

21376

直接返回 PID,干净利落。

💡 小技巧:如果 netstat 命令不存在,可尝试安装 net-tools 包(如 Ubuntu 下执行 sudo apt install net-tools

3.2 修改服务运行端口

如果你确认当前端口必须被保留(比如测试环境共用服务),最安全的做法是修改 Tomcat 的监听端口

步骤如下:

  1. 进入 Tomcat 安装目录下的 conf 文件夹
  2. 打开 server.xml
  3. 找到 <Connector> 标签,修改 port 属性

修改前:

<Connector port="8080" protocol="HTTP/1.1" 
  connectionTimeout="20000" redirectPort="8443" />

修改后(例如改为 8081):

<Connector port="8081" protocol="HTTP/1.1" 
  connectionTimeout="20000" redirectPort="8443" />

保存并重启 Tomcat,服务即可在新端口正常启动。

✅ 适用场景:多项目并行开发、Docker 容器化部署映射端口等

3.3 终止占用端口的进程

如果你确定当前占用端口的进程是可以终止的(比如残留的 Java 进程),可以直接杀掉它。

Windows

taskkill /F /PID 21376
  • /F 表示强制终止
  • /PID 指定进程 ID

Linux / Unix

kill -9 21376

⚠️ 注意:原文中的 kill - 21376 存在笔误,正确应为 kill -9 21376kill -SIGKILL 21376

macOS

kill -9 21376

macOS 和 Linux 一致,-9 信号强制杀死进程。

❌ 风险提示:kill -9 是暴力手段,可能导致数据未持久化或资源未释放。建议优先尝试 kill -15(优雅关闭),无效后再用 -9

4. 总结

java.net.BindException: Address already in use 虽然频繁出现,但本质并不复杂:

  • 核心原因:端口被占用
  • 解决路径:查进程 → 杀进程 or 换端口

推荐日常开发中:

✅ 使用 lsof / netstat 快速诊断
✅ 多环境开发时统一规划端口(如 8080~8083)
✅ 部署脚本中加入端口检查逻辑,避免上线踩坑

只要掌握这些基本操作,这类问题就能做到“秒级恢复”,不再耽误开发节奏。


原始标题:The Tomcat java.net.BindException: Address Already in Use Error in Java