大家好,我是你们的技术小伙伴!今天来聊聊一个开发过程中常见但又让人抓狂的问题——Tomcat启动失败,报错“Address already in use”。别担心,跟着我一起看看如何解决这个小麻烦,让我们的开发之旅顺风顺水 !
当你满怀期待地启动Spring Boot应用时,日志突然抛出这样一行错误:
2025-03-03 17:22:10.515 ERROR ... : Failed to start component [Connector[HTTP/1.1-8087]]
...
Caused by: java.net.BindException: Address already in use
这行错误信息告诉我们:Tomcat试图监听端口 8087,可是这个端口已经被其他进程占用了,导致它无法启动。这就好比你找了一个完美的停车位,结果发现那车早就停在那里了 。
接下来我们使用终端命令来确认到底哪个进程在霸占这个端口。只需在命令行输入:
lsof -i :8087
命令执行后,你会看到类似这样的输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 59654 dgq 269u IPv6 0x22cbffb1dc5198d 0t0 TCP *:8087 (LISTEN)
原来,一个PID为 59654 的 Java 进程正在监听端口 8087。这可能是之前启动的应用实例还没有正常关闭,或者另一个项目正在使用这个端口 。
如果你确认这个进程不该再运行,可以直接终止它。使用下面的命令:
kill -9 59654
这样就可以强制结束进程,释放8087端口。执行完毕后,再次启动你的应用,Tomcat应该能顺利绑定端口啦 !
如果你不想杀掉这个进程,或者想同时运行多个应用,也可以更改你应用的端口配置。只需在你的 application.properties
或 application.yml
文件中修改端口号,例如:
server.port=9090
然后重启应用,让它使用一个新的、不冲突的端口启动。这种方法也非常简单有效 !
日志中还提到一些关于 Druid-ConnectionPool 的警告,提示某些线程没有正常关闭,可能会导致内存泄漏。这提醒我们,除了端口问题外,确保应用在关闭时能正确释放所有资源也是非常重要的。毕竟,干净的环境才能让你的应用长期稳定运行 ✨。
今天我们一起经历了Tomcat端口冲突的小冒险,学会了如何:
lsof
命令确定端口占用情况。希望这篇文章能帮助大家更好地解决类似的问题,让开发路上少一些烦恼,多一些乐趣!如果你有其他问题或好的解决方案,欢迎在评论区分享交流哦 !
Happy Coding!