缘起
从前有一个SpringBoot程序,我启动了它。很不幸启动失败,报错如下:
[2020-04-29 16:30:51.086] [main] [ERROR] [apache.catalina.core.StandardService:182 ] - Failed to start connector [Connector[HTTP/1.1-8081]]
org.apache.catalina.LifecycleException: Failed to start component [Connector[HTTP/1.1-8081]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:225)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:261)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:198)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:311)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:164)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230)
at onemore.study.EightZeroEightOneApplication.main(EightZeroEightOneApplication.java:18)
Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1020)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 13 common frames omitted
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:219)
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1156)
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:591)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1018)
... 14 common frames omitted
很明显,启动失败的原因是8081端口被占用了。这个很简单,找到占用端口的进程,把它杀掉就可以了。
寻找解决办法之路
查找占用8081端口的进程的PID:
C:\>netstat -nao | findstr "8081"
TCP 0.0.0.0:8081 0.0.0.0:0 LISTENING 25056
TCP [::]:8081 [::]:0 LISTENING 25056
根据进程的PID查找进程名:
C:\>tasklist | findstr 25056
macmnsvc.exe 25056 Services 0 7,548 K
根据进程名杀掉进程:
C:\>taskkill /f /t /im macmnsvc.exe
错误: 无法终止 PID 25056 (属于 PID 824 子进程)的进程。
原因: 拒绝访问。
拒绝访问?这是什么进程?搜了一下,原来是McAfee Agent,杀毒软件肯定有保护机制,无法结束进程。又搜了一下,McAfee Agent如何修改端口。只在McAfee论坛上找到了一篇几年的帖子,McAfee工程师是这样回复的:
按照McAfee工程师的指引,我没有找到对应的配置选项,可能是时间久远版本不同了。解决方法的寻找之路就此陷入了尴尬的境地。
最终解决办法
不过,在搜索的过程中,我发现一个叫做FrmInst.exe的程序,它用于McAfee Agent框架安装。它有很多参数,详见用于在 Windows 上安装 McAfee Agent 的命令行选项。我注意到一个参数:/REMOVE
,如果 McAfee Agent 未使用,则将其删除。 如果正在使用,McAfee Agent 将更改为更新程序模式。 于是,我尝试了一下:
"C:\Program Files\McAfee\Agent\x86\FrmInst.exe" /REMOVE=AGENT
McAfee Agent开始被重新安装,重新安装后奇迹出现了,8081端口不再被占用了。