SpringBoot项目启动异常:端口未占用仍提示占用或方法名非法
我之前也碰到过这种诡异的共性问题,明明没改代码,跑任何项目都出问题,给你几个实际有效的排查方向:
先清掉残留的Java进程
有时候netstat查端口没被占用,但之前启动的SpringBoot进程其实没彻底死掉,只是没监听端口了,却还占着JVM资源。你可以用jps -l命令列出所有Java进程,找到和你项目相关的进程ID,用kill -9 <进程ID>(Linux/macOS)或者任务管理器(Windows)彻底杀掉,再重新启动项目试试。排查
Invalid character found in method name的根源
这个错误一般是因为收到了不符合HTTP规范的请求——比如客户端用了过时的HTTP/0.9协议,或者请求方法里带了特殊字符,也有可能是反向代理、网关的配置把请求格式搞乱了。你可以看看项目的日志,定位请求来源:如果是本地测试,检查下Postman、curl这类工具的配置,或者浏览器插件是不是在发奇怪的请求;如果是服务器环境,看看有没有反向代理的配置错误。另外,虽然你说8443能正常跑,也可以确认下有没有把HTTP请求误发到HTTPS端口的情况。检查全局配置或环境变量的冲突
既然所有项目都出问题,肯定不是单个项目的代码问题,大概率是全局配置或环境变量搞的鬼。比如:- 有没有修改过Maven的
settings.xml或者Gradle的gradle.properties,导致所有项目都继承了异常的端口配置? - 有没有设置过系统环境变量
SERVER_PORT,强制指定了某个端口? - 启动项目时有没有不小心加了重复的
--server.port参数,或者其他和端口相关的启动参数?
- 有没有修改过Maven的
解释下8080报错但8443能运行的现象
这是因为你的项目配置了HTTPS,SpringBoot启动时会先尝试启动默认的HTTP端口(8080),如果这个过程失败了,它并不会直接终止,而是继续尝试启动HTTPS端口(8443),所以就出现了“报错但HTTPS能用”的情况。这说明HTTP端口的启动问题不是真的被占用,而是有其他障碍,比如上面说的进程残留或者配置冲突。最后试试清理缓存重建项目
IDE的缓存有时候会导致各种莫名其妙的问题,你可以试试清理IDE缓存(比如IntelliJ的File -> Invalidate Caches...),然后执行mvn clean install(Maven)或者gradle clean build(Gradle)重新构建项目,再启动看看。
内容的提问来源于stack exchange,提问作者pin54

