在学习springcloud的过程中,启动项目时报错如下:
2021-07-15 10:01:11.675 DEBUG 1648 --- [ restartedMain] o.s.b.d.livereload.LiveReloadServer : Starting live reload server on port 35729
2021-07-15 10:01:11.676 WARN 1648 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : Unable to start LiveReload server
2021-07-15 10:01:11.679 DEBUG 1648 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : Live reload start error
java.net.BindException: Address already in use: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method) ~[na:1.8.0_171]
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106) ~[na:1.8.0_171]
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387) ~[na:1.8.0_171]
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190) ~[na:1.8.0_171]
at java.net.ServerSocket.bind(ServerSocket.java:375) ~[na:1.8.0_171]
at java.net.ServerSocket.<init>(ServerSocket.java:237) ~[na:1.8.0_171]
at java.net.ServerSocket.<init>(ServerSocket.java:128) ~[na:1.8.0_171]
at org.springframework.boot.devtools.livereload.LiveReloadServer.start(LiveReloadServer.java:114) ~[spring-boot-devtools-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.springframework.boot.devtools.autoconfigure.OptionalLiveReloadServer.startServer(OptionalLiveReloadServer.java:56) [spring-boot-devtools-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.springframework.boot.devtools.autoconfigure.OptionalLiveReloadServer.afterPropertiesSet(OptionalLiveReloadServer.java:49) [spring-boot-devtools-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1853) [spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1790) [spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) [spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) [spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) [spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) [spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) [spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) ~[spring-context-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.2.RELEASE.jar:2.3.2.RELEASE]
at org.winter.cloud.Payment8001.main(Payment8001.java:15) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.3.2.RELEASE.jar:2.3.2.RELEASE]
刚开始只关注了Address already in use: JVM_Bind
这句话,没有注意这句话上面的日志,于是就以为是服务的端口被占用了,cmd
窗口稀里糊涂执行命令就是一顿操作
C:\Users\86187>netstat -ano | findstr "8001"
TCP 0.0.0.0:8001 0.0.0.0:0 LISTENING 1648
TCP [::]:8001 [::]:0 LISTENING 1648
C:\Users\86187>taskkill /f /pid 1648
成功: 已终止 PID 为 1648 的进程。
结果还是不行,后来才注意到了这句话
才明白了,是因为同时启动了好几个服务,而他们都使用了
spring-boot-devtools
,
关于LiveReload
spring-boot-devtools
提供的另一项特别有用的功能就是LiveReload
,常规web开发中,如果修改了css/javascript/html等前端内容,至少得刷新下页面,才能看到最新效果,而LiveReload则可以让开发人员,在任何编辑器中,只要修改了源代码(比如:将某个标题设置成红色),网页就实时做出相应的响应(即:字变红),不需要刷新。
秘密就在于spring-boot-devtools
在应用启动时,自带了一个LiveReload Service
,参考截图
综上所述,如果同时启动好几个服务,大家都有用
spring-boot-devtools
,然后都会尝试启动LiveReload Service
,但是端口35729只有一个,所以只有第一个会成功,后面启动的服务就会报java.net.BindException
,不过,也不会影响整个服务,我们可以选择在配置文件中修改配置:
- 手动修改
LiveReload
的端口
spring:
devtools:
livereload:
port: 35730
- 关闭
LiveReload
spring:
devtools:
livereload:
enabled: false
参考文章:https://www.cnblogs.com/yjmyzz/p/use-devtools-of-spring-boot-framework.html