在调试模式下启动时,Spring-Boot 2.2.0进程无法终止

时间:2019-10-22 17:40:03

标签: spring-boot terminate

在Eclipse 2019-06和IntelliJ 2019.2中以调试模式运行spring-boot 2.2.0时,尝试通过IDE终止该进程的过程看起来像是杀死了该进程(通过IDE),但是Java进程是仍在运行(已通过ps -ef | grep java验证)。

在Eclipse中运行非调试模式时,该过程可以终止,但是Eclipse显示一条消息,指出“终止失败”。

我尝试了各种较早的帖子选项,包括: -Dspring-boot:run.fork =假 -Dfork = false

使用mvn spring-boot:run在cmd行上运行spring通常以ctrl-c终止。

我在Eclipse中没有使用任何spring插件。我正在使用开放式jdk 11.0.3 + 7。

在Spring Boot 2.1.7、2.1.8和2.1.9中,一切正常工作

这可能是spring-boot 2.2.0中的错误吗?

2 个答案:

答案 0 :(得分:0)

使用Spring Boot v2.2.0.RELEASE,从maven插件启动时,默认情况下启用JVM进程分叉:

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#fork-enabled-by-default-in-maven-plugin

目前,Intellij的maven插件(2019.2和更早的版本)似乎没有将子进程与调试会话相关联,IDE甚至无法在启动后关闭该进程。

以下参考文献中的任何解决方案都不适合我。我发现禁用分叉的唯一方法是直接在pom.xml的spring-boot-maven-plugin中设置标志,如下所示:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <!-- disable process forking that is enabled by default in spring-boot 2.2.0.RELEASE and higher -->
        <fork>false</fork>
    </configuration>
</plugin>

然后,我现在可以右键单击spring-boot:run,选择debug,然后调试器将连接到正确的子进程。

其他参考:

https://github.com/spring-projects/spring-boot/issues/18638

https://github.com/spring-projects/spring-boot/issues/18706

答案 1 :(得分:0)

当我迁移到2.2.0(+ JDK 11)时,我遇到了同样的问题。

如@guidadic所说:从2.2.0开始,默认情况下分叉JVM。

对我来说不幸的是,如果禁用分叉功能,则会丢失某些功能,例如控制台中的颜色,这些功能以前没有分叉就可以使用。此外,分叉允许通过实时重新加载使用DevTools,这很有趣。

在互联网上进行了长期危险的搜索后,我找到了一个与Stackoverflow无关的答案(我丢失了链接)。

在main方法中,从run方法获取应用程序上下文,然后打开控制台扫描器。
当您按红色方块杀死Eclipse中的应用程序时,扫描程序将引发异常:Eclipse托管(可见)线程是与控制台链接的线程,因此扫描程序不喜欢您敢停止它。 br /> 您只需要捕获它即可退出应用程序:

log.info("Press 'Enter' to terminate");
try (Scanner scanner = new Scanner(System.in)) {
    scanner.nextLine();
}
finally {
    log.info("Exiting");
    System.exit(SpringApplication.exit(context));
}

此外,如果您在Eclipse控制台中按“ enter”,它将退出您的应用程序并终止所有应用程序JVM。