【问题标题】:Terminating mvn spring-boot:run doesn't stop tomcat终止 mvn spring-boot:run 不会停止 tomcat
【发布时间】:2014-06-19 09:42:08
【问题描述】:

我可以使用mvn spring-boot 成功启动spring-boot,documentation 提到要优雅地退出应用程序点击ctrl-c

Terminate batch job (Y/N)? Y

maven 进程确实终止了,但 Tomcat 仍在运行,我仍然可以访问网页。当我再次尝试启动 spring-boot 时,它无法启动 Tomcat,因为该端口正在使用中。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v1.1.0.BUILD-SNAPSHOT)

2014-05-02 12:13:57.666  INFO 6568 --- [           main] Example                                  : Starting Example on challenger with PID 6568 (E:\workspace\SpringBoot\target\cla
sses started by steven in E:\workspace\SpringBoot)
2014-05-02 12:13:57.707  INFO 6568 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWeb
ApplicationContext@11ecab7c: startup date [Fri May 02 12:13:57 EDT 2014]; root of context hierarchy
2014-05-02 12:13:58.097  INFO 6568 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean
: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfi
gure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class pat
h resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; laz
yInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAuto
ConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfig
ure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2014-05-02 12:13:58.682  INFO 6568 --- [           main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080
2014-05-02 12:13:58.892  INFO 6568 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2014-05-02 12:13:58.892  INFO 6568 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.53
2014-05-02 12:13:58.981  INFO 6568 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-05-02 12:13:58.981  INFO 6568 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1277 ms
2014-05-02 12:13:59.453  INFO 6568 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-05-02 12:13:59.455  INFO 6568 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2014-05-02 12:13:59.570 ERROR 6568 --- [           main] o.a.coyote.http11.Http11NioProtocol      : Failed to start end point associated with ProtocolHandler ["http-nio-8080"]

java.net.BindException: Address already in use: bind
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:344)
        at sun.nio.ch.Net.bind(Net.java:336)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:199)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:473)
        at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:647)
        at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:449)
        at org.apache.catalina.connector.Connector.startInternal(Connector.java:1007)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:459)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:731)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:341)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:79)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.java:69)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:270)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:145)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:159)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:132)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:680)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:930)
        at Example.main(Example.java:16)

2014-05-02 12:13:59.571 ERROR 6568 --- [           main] o.apache.catalina.core.StandardService   : Failed to start connector [Connector[org.apache.coyote.http11.Http11NioProtocol-
8080]]

org.apache.catalina.LifecycleException: Failed to start component [Connector[org.apache.coyote.http11.Http11NioProtocol-8080]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:459)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:731)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:341)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:79)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.java:69)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:270)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:145)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:159)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:132)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:680)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:930)
        at Example.main(Example.java:16)
Caused by: org.apache.catalina.LifecycleException: service.getName(): "Tomcat";  Protocol handler start failed
        at org.apache.catalina.connector.Connector.startInternal(Connector.java:1014)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 18 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:344)
        at sun.nio.ch.Net.bind(Net.java:336)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:199)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:473)
        at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:647)
        at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:449)
        at org.apache.catalina.connector.Connector.startInternal(Connector.java:1007)
        ... 19 common frames omitted

2014-05-02 12:13:59.572  INFO 6568 --- [           main] o.apache.catalina.core.StandardService   : Stopping service Tomcat
2014-05-02 12:13:59.580  INFO 6568 --- [           main] .b.l.ClasspathLoggingApplicationListener : Application failed to start with classpath: [file:/E:/workspace/SpringBoot/src/m
ain/resources, file:/E:/workspace/SpringBoot/src/main/resources, file:/E:/workspace/SpringBoot/target/classes/, file:/C:/Users/steven/.m2/repository/org/springframework/boot/spring
-boot-starter-web/1.1.0.BUILD-SNAPSHOT/spring-boot-starter-web-1.1.0.BUILD-SNAPSHOT.jar, file:/C:/Users/steven/.m2/repository/org/springframework/boot/spring-boot-starter/1.1.0.BUI
LD-SNAPSHOT/spring-boot-starter-1.1.0.BUILD-SNAPSHOT.jar, file:/C:/Users/steven/.m2/repository/org/springframework/boot/spring-boot/1.1.0.BUILD-SNAPSHOT/spring-boot-1.1.0.BUILD-SNA
PSHOT.jar, file:/C:/Users/steven/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/1.1.0.BUILD-SNAPSHOT/spring-boot-autoconfigure-1.1.0.BUILD-SNAPSHOT.jar, file:/C:
/Users/steven/.m2/repository/org/springframework/boot/spring-boot-starter-logging/1.1.0.BUILD-SNAPSHOT/spring-boot-starter-logging-1.1.0.BUILD-SNAPSHOT.jar, file:/C:/Users/steven/.
m2/repository/org/slf4j/jcl-over-slf4j/1.7.7/jcl-over-slf4j-1.7.7.jar, file:/C:/Users/steven/.m2/repository/org/slf4j/slf4j-api/1.7.7/slf4j-api-1.7.7.jar, file:/C:/Users/steven/.m2
/repository/org/slf4j/jul-to-slf4j/1.7.7/jul-to-slf4j-1.7.7.jar, file:/C:/Users/steven/.m2/repository/org/slf4j/log4j-over-slf4j/1.7.7/log4j-over-slf4j-1.7.7.jar, file:/C:/Users/st
even/.m2/repository/ch/qos/logback/logback-classic/1.1.2/logback-classic-1.1.2.jar, file:/C:/Users/steven/.m2/repository/ch/qos/logback/logback-core/1.1.2/logback-core-1.1.2.jar, f
ile:/C:/Users/steven/.m2/repository/org/yaml/snakeyaml/1.13/snakeyaml-1.13.jar, file:/C:/Users/steven/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/1.1.0.BUILD
-SNAPSHOT/spring-boot-starter-tomcat-1.1.0.BUILD-SNAPSHOT.jar, file:/C:/Users/steven/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/7.0.53/tomcat-embed-core-7.0.53.jar, f
ile:/C:/Users/steven/.m2/repository/org/apache/tomcat/embed/tomcat-embed-el/7.0.53/tomcat-embed-el-7.0.53.jar, file:/C:/Users/steven/.m2/repository/org/apache/tomcat/embed/tomcat-e
mbed-logging-juli/7.0.53/tomcat-embed-logging-juli-7.0.53.jar, file:/C:/Users/steven/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.3.3/jackson-databind-2.3.3.jar, fi
le:/C:/Users/steven/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.3.0/jackson-annotations-2.3.0.jar, file:/C:/Users/steven/.m2/repository/com/fasterxml/jackson/co
re/jackson-core/2.3.3/jackson-core-2.3.3.jar, file:/C:/Users/steven/.m2/repository/org/springframework/spring-web/4.0.3.RELEASE/spring-web-4.0.3.RELEASE.jar, file:/C:/Users/steven/
.m2/repository/org/springframework/spring-aop/4.0.3.RELEASE/spring-aop-4.0.3.RELEASE.jar, file:/C:/Users/steven/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar, file
:/C:/Users/steven/.m2/repository/org/springframework/spring-beans/4.0.3.RELEASE/spring-beans-4.0.3.RELEASE.jar, file:/C:/Users/steven/.m2/repository/org/springframework/spring-cont
ext/4.0.3.RELEASE/spring-context-4.0.3.RELEASE.jar, file:/C:/Users/steven/.m2/repository/org/springframework/spring-core/4.0.3.RELEASE/spring-core-4.0.3.RELEASE.jar, file:/C:/Users
/steven/.m2/repository/org/springframework/spring-webmvc/4.0.3.RELEASE/spring-webmvc-4.0.3.RELEASE.jar, file:/C:/Users/steven/.m2/repository/org/springframework/spring-expression/4
.0.3.RELEASE/spring-expression-4.0.3.RELEASE.jar]
Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedde
d.EmbeddedServletContainerException: Unable to start embedded Tomcat
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:135)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476)
[INFO] ------------------------------------------------------------------------
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
[INFO] BUILD SUCCESS
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:680)
[INFO] ------------------------------------------------------------------------
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
[INFO] Total time: 4.653 s
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:930)
        at Example.main(Example.java:16)
Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
[INFO] Finished at: 2014-05-02T12:13:59-05:00
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:106)
[INFO] Final Memory: 16M/232M
[INFO] ------------------------------------------------------------------------
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.java:69)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:270)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:145)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:159)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:132)
        ... 7 more
Caused by: java.lang.IllegalStateException: Tomcat connector in failed state
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:102)
        ... 12 more

要继续,我必须手动终止正在运行的进程。这是一个错误还是我错过了什么?

【问题讨论】:

  • 查看我的回答 [这里][1] [1]:stackoverflow.com/questions/23553018/…
  • 只需将您的项目作为 Java 应用程序运行即可。 Spring boot 使您的 jar 成为可执行文件。在 Eclipse 中:运行方式 > Java 应用程序

标签: java spring maven tomcat spring-boot


【解决方案1】:

在 Windows 7 上运行的 1.1.9 版我仍然会遇到这种情况。

所以在按下 Ctrl C 之后。 杀死后台 java 的最快方法是 .

查找java PID

     c:\>netstat -ano | find "8080"
     TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       1196
     TCP    [::]:8080              [::]:0                 LISTENING       1196
     c:\>taskkill /F /PID 1196
     SUCCESS: The process with PID 1196 has been terminated.

我在上面的例子中假设你在 http 端口 8080 上运行

对于 Mac 用户:

     $lsof -i :8080
     COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
     java    SOME_PID user  417u  IPv6 0xa4b3be242c249a27      0t0  TCP *:name (LISTEN)
     kill -9 SOME_PID

【讨论】:

  • 如果在运行 taskkill 时收到 Access Denied 消息,请确保您在管理员模式下运行 cmd
  • @gudthing 不错。我得到“拒绝访问”,然后我在管理员模式下运行 cmd,它可以工作。我想知道如果我终止使用该端口的任务(A),当这个任务(A)稍后运行时会导致问题吗?
【解决方案2】:

这是我在 Mac 上所做的:

kill `lsof -i -n -P | grep TCP | grep 8080 | tr -s " " "\n" | sed -n 2p`

它使用8080找到PID并杀死它。

【讨论】:

【解决方案3】:

编辑: 在 ubuntu 中,使用命令:

fuser -k 8080/tcp

杀死进程。我正在使用 spring-boot 1.3.0-Build-snapshot 并且问题仍然存在。我的 SO 是 Ubuntu,问题发生在 Eclipse 或控制台运行。关于这个问题的讨论是here。这似乎是 spring-boot 库的问题,至少与 tomcat 库有关。我也在排队进行此修复。不幸的是,这是我们在尖端技术成熟之前尝试使用它们所付出的代价。

【讨论】:

  • 也许这应该是一条评论?
  • 这其实是最好的解决方案
【解决方案4】:

对于那些使用 Eclipse 的人来说,这是迄今为止最好的答案:

打开“运行配置”,编辑您为项目定义的 maven 启动,然后在“JRE”选项卡下,将 -Dfork=false 添加到 VM 参数文本区域。

然后当你点击红色停止按钮时,tomcat 服务器将停止,你的端口将被释放。

Answer comes from a post here on Github by jordihs

【讨论】:

    【解决方案5】:

    在 IDEA 中,您必须先停止进程,然后才能再次运行。该命令将关闭嵌入式 Tomcat。

    【讨论】:

      【解决方案6】:

      我知道我来不及回答,但可能有人会得到帮助。 STS 用户可以使用Relaunch 按钮而不是Run 来确保关闭任何现有实例。
      供参考:
      https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-running-your-application.html

      【讨论】:

        【解决方案7】:

        这只发生在 Windows 中。 https://github.com/spring-projects/spring-boot/issues/773

        更新:现在应该修复了。

        【讨论】:

        • 我在1.1.4.BUILD-SNAPSHOT,它仍然存在。 “应该修复”是什么意思?
        • 我的意思是这个问题已经解决(如果你从 Windows 的 cmd 窗口运行,你可以使用 CTRL-C 停止构建和应用程序)。如果您使用的是 Cygwin,您可能会发现它仍然是个问题,但 Cygwin 是独一无二的,我不确定是否可以在那里修复。
        • 用完Eclipse还是有问题
        • 在 Eclipse 中运行什么?你到底做了什么?
        • 项目右键->运行方式->Maven构建。在目标中放入“spring-boot:run”运行应用程序。现在终止它(通过控制台视图中通常的红色停止按钮)。 Spring-boot 进程仍在运行。
        【解决方案8】:

        是的,当您使用 spring-boot-run 进行 maven 安装并且应用程序停止后,tomcat 端口仍会侦听,这是正确的。

        我为那些遇到此问题的人附上了屏幕截图,端口/地址已在使用中。 您需要做的是在再次运行 Spring Boot 应用程序之前,只需转到您的 Windows 任务管理器并结束名为“Java(TM) Platform SE binary”的进程并运行您的启动应用程序,您的端口将没有该进程并且您不会再遇到问题了。(在first time 运行应用程序后,您不必这样做) 它为我创造了奇迹。希望对你有帮助 美好的一天

        【讨论】:

          【解决方案9】:

          我也遇到了同样的问题,但是有一种更好更简单的方法来运行没有这个问题的 Spring boot 应用程序。

          运行方式 -> Java 应用程序

          更新: 此外,如果您使用 Spring STS(适用于 VS Code、IntelliJ、Eclipse...),您就有机会从 Boot Dashboard 管理您的应用程序。真的很有用。

          【讨论】:

            【解决方案10】:

            我在 Mac 上从 netbeans 8.1 运行 spring boot 应用程序时遇到了这个问题。当我在 netbeans 中点击红色方形按钮时,java 进程没有终止,所以当我重新启动应用程序时,我总是得到“绑定异常,地址已在使用”的东西。这是已知的错误。

            解决方案是 add spring-boot:run 运行项目目标的命令...

            ...而且如果你得到“No plugin found for prefix 'spring-boot' in the current project and in the plugin groups”你可能需要将它添加到依赖项中: p>

            <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>1.3.5.RELEASE</version>
            </parent>
            
            <repositories>
                <repository>
                    <id>spring-releases</id>
                    <url>https://repo.spring.io/libs-release</url>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>spring-releases</id>
                    <url>https://repo.spring.io/libs-release</url>
                </pluginRepository>
            </pluginRepositories>
            

            【讨论】:

              【解决方案11】:

              我在 Mac 上的 Eclipse 中运行 SpringBoot 应用程序时遇到了同样的问题。我必须手动找到所有使用 8080 的 PID 并杀死它们。但是,幸运的是,我意识到我们可以直接从 Eclipse“控制台”视图中杀死那个 tomcat 实例,方法是点击停止(红色方形图标)按钮并再次运行 spring boot 应用程序。

              【讨论】:

              • 这仅在您在 VM 参数中添加 fork=false 时有效。看我的回答。
              【解决方案12】:

              您通过调用导致关机 curl -v -X POST http://127.0.0.1:8091/shutdown 前提是您正确配置了 spring-boot。

              为了支持这一点,您必须更新您的应用程序属性。这在https://stackoverflow.com/a/26563344/58794 中有部分描述。

              通过添加更新 application.yml:

              management:
                security:
                  enabled: false
              endpoints:
                shutdown:
                  enabled: true
              

              或通过添加更新 application.properties:

              management.security.enabled=false
              endpoints.shutdown.enabled=true
              

              曾经调用过

              $ curl -v -X POST http://127.0.0.1:8091/shutdown
              * STATE: INIT => CONNECT handle 0x600057990; line 1423 (connection #-5000)
              * Added connection 0. The cache now contains 1 members
              *   Trying 127.0.0.1...
              * TCP_NODELAY set
              * STATE: CONNECT => WAITCONNECT handle 0x600057990; line 1475 (connection #0)
              * Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)
              * STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x600057990; line 1592 (connection #0)
              * Marked for [keep alive]: HTTP default
              * STATE: SENDPROTOCONNECT => DO handle 0x600057990; line 1610 (connection #0)
              > POST /shutdown HTTP/1.1
              > Host: 127.0.0.1:8091
              > User-Agent: curl/7.56.1
              > Accept: */*
              >
              * STATE: DO => DO_DONE handle 0x600057990; line 1689 (connection #0)
              * STATE: DO_DONE => WAITPERFORM handle 0x600057990; line 1814 (connection #0)
              * STATE: WAITPERFORM => PERFORM handle 0x600057990; line 1824 (connection #0)
              * HTTP 1.1 or later with persistent connection, pipelining supported
              < HTTP/1.1 200
              < X-Application-Context: application:h2:8091
              < Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
              < Transfer-Encoding: chunked
              < Date: Fri, 22 Dec 2017 07:01:04 GMT
              <
              * STATE: PERFORM => DONE handle 0x600057990; line 1993 (connection #0)
              * multi_done
              * Connection #0 to host 127.0.0.1 left intact
              * Expire cleared
              {"message":"Shutting down, bye..."}
              

              容器将关闭

              o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 0
              o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
              j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
              

              但如果您从 mvn spring-boot:run 启动,您可能会得到:

              [INFO] ------------------------------------------------------------------------
              [INFO] BUILD FAILURE
              [INFO] ------------------------------------------------------------------------
              [INFO] Total time: 35.613 s
              [INFO] Finished at: 2017-12-22T02:01:05-05:00
              [INFO] Final Memory: 25M/577M
              [INFO] ------------------------------------------------------------------------
              [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.7.RELEASE:run (default-cli) on project PROJECTNAME: Could not exec java: Application finished with exit code: 1 -> [Help 1]
              

              如果您没有management.security.enabled=false,您可能会看到以下错误:

              $ curl -v -X POST http://127.0.0.1:8091/shutdown
              > POST /shutdown HTTP/1.1
              > Host: 127.0.0.1:8091
              > User-Agent: curl/7.56.1
              > Accept: */*
              >
              < HTTP/1.1 401
              < X-Application-Context: application:h2:8091
              < Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
              < Transfer-Encoding: chunked
              < Date: Fri, 22 Dec 2017 06:56:19 GMT
              <
              {"timestamp":1513925779265,"status":401,"error":"Unauthorized","message":"Full authentication is required to access this resource.","path":"/shutdown"}
              

              如果您没有endpoints.shutdown.enabled=true,您将看到:

              $ curl -v -X POST http://127.0.0.1:8091/shutdown
              > POST /shutdown HTTP/1.1
              > Host: 127.0.0.1:8091
              > User-Agent: curl/7.56.1
              > Accept: */*
              >
              < HTTP/1.1 404
              < X-Application-Context: application:h2:8091
              < Content-Type: application/json;charset=UTF-8
              < Transfer-Encoding: chunked
              < Date: Fri, 22 Dec 2017 06:58:52 GMT
              <
              {"timestamp":1513925932345,"status":404,"error":"Not Found","message":"No message available","path":"/shutdown"}
              

              如果您尝试使用 GET 而不是 POST,则会出现此错误:

              $ curl -v http://127.0.0.1:8091/shutdown
              > GET /shutdown HTTP/1.1
              > Host: 127.0.0.1:8091
              > User-Agent: curl/7.56.1
              > Accept: */*
              >
              < HTTP/1.1 405
              < X-Application-Context: application:h2:8091
              < Allow: POST
              < Content-Type: application/json;charset=UTF-8
              < Transfer-Encoding: chunked
              < Date: Fri, 22 Dec 2017 06:54:12 GMT
              <
              {"timestamp":1513925652827,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'GET' not supported","path":"/shutdown"}
              

              【讨论】:

                【解决方案13】:

                此解决方案适用于 Spring Boot v1.x,现在适用于 v2.x:

                hangingJavaProcessToStop=`jps | grep Application | awk '{print $1}'`
                echo "hangingJavaProcessToStop: $hangingJavaProcessToStop"
                kill -9 $hangingJavaProcessToStop
                

                这样你可以专门杀死 Spring Boot 的 Application Java 进程,而不是一次杀死所有 Java 进程。我假设如果您的 Spring Boot“应用程序”(包含类的main 方法)的调用方式不同,则必须使用其名称而不是 Application

                我正在使用 WSL/Debian 在我的 Windows 机器上运行上面的 sn-p。我没有使用 PowerShell 或 Windows 的命令行。

                【讨论】:

                  【解决方案14】:

                  如果您使用的是 NetBeans,您可以通过单击右下角显示运行(项目名称)的十字图标来停止服务器或进程。

                  【讨论】:

                    【解决方案15】:

                    对于 Powershell,将以下代码放入以 '.ps1' 结尾的文件中 $processes = (get-NetTCPConnection| ? {$_.LocalPort -eq "8080"}).OwningProcess foreach ($process in $processes) {Get-Process -PID $process | Stop-Process -Force}

                    【讨论】:

                      【解决方案16】:

                      我们可以直接从 eclipse console 视图中杀死那个 tomcat 实例,方法是点击停止(红色方形图标)按钮和运行图标旁边的红色按钮,再次运行 spring boot 应用程序。

                      【讨论】:

                        【解决方案17】:

                        我在 Windows 10 中遇到了同样的问题,我在 Cygwin 终端中运行 mvn spring-boot:run。我什至无法使用ps -ef 在 Cygwin 中找到 Tomcat 进程;我必须使用netstat -ao 在PowerShell 中搜索进程。

                        在 PowerShell 中使用 mvn spring-boot:run 对我来说效果很好。

                        【讨论】:

                          【解决方案18】:

                          我最近在 Mac OS 上遇到了同样的问题,似乎是升级我的 Mac OS 版本后发生的。

                          使用 IntelliJ IDEA 作为 IDE 并安装 spring boot,由于端口仍然打开,运行过程无法停止。每次都要用lsof -i:&lt;running port&gt;kill -9 &lt;PID&gt;手动杀死进程,烦人!

                          【讨论】:

                            【解决方案19】:

                            在eclipse的情况下:: 如果遇到这个错误,你可以在eclipse上停止它,不需要从任务管理器中杀掉,请参考SS,这里所有正在运行的服务都存在,选择一个并停止它们。 SS for error on eclipse

                            【讨论】:

                              【解决方案20】:

                              依次键入以下命令。

                              $ ps -ef | grep -i java
                              $ kill -9 3361
                              

                              【讨论】:

                              • 每个人都有不同的 PID 而不是 3361。
                              • 帮助。谢谢。顺便说一句:我能够修改 PID。 :-)
                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2018-04-25
                              • 2011-06-11
                              相关资源
                              最近更新 更多