首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring-Boot 2.2.0进程在调试模式下启动时无法终止

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

Stack Overflow用户
提问于 2019-10-23 01:40:03
回答 2查看 1.9K关注 0票数 1

当在Eclipse2019-06和IntelliJ 2019.2中以调试模式运行spring-boot 2.2.0时,试图通过集成开发环境终止进程看起来像是杀死了进程(根据集成开发环境),但是,java进程仍在运行(由ps -ef | grep java验证)。

当在Eclipse中运行非调试模式时,可以终止进程,但是Eclipse会显示一条消息,声明"terminate failed“。

我尝试过所有旧的post选项,包括:-Dspring-boot:run.fork=false -Dfork=false

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

我没有在Eclipse中使用任何spring插件。我使用的是open jdk 11.0.3+7。

spring-boot 2.1.7、2.1.8和2.1.9一切正常

这可能是spring-boot 2.2.0中的一个bug吗?

EN

回答 2

Stack Overflow用户

发布于 2019-11-05 05:24:26

在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甚至无法在启动后关闭进程。

下面的参考资料中的解决方案对我都不起作用。我发现禁用forking的唯一方法是直接在pom.xml中的spring-boot-maven-plugin中设置标志,如下所示:

代码语言:javascript
运行
复制
<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

票数 2
EN

Stack Overflow用户

发布于 2019-12-04 23:58:11

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

正如@ since所说:从2.2.0开始,默认情况下会派生JVM。

不幸的是,如果我禁用了forking,我就会失去一些功能,比如控制台中的颜色,这在以前没有fork的情况下是有效的。此外,forking允许使用DevTools,并进行实时重新加载,这非常有趣。

在互联网上进行了长时间的危险搜索后,我在某个地方找到了一个不相关的Stackoverflow答案的解决方案(我丢失了链接)。

在main方法中,从run方法获取应用程序上下文,然后打开控制台扫描器。

当您在Eclipse中按下红色方块来终止您的应用程序时,扫描程序会抛出一个异常: Eclipse托管(可见)线程是链接到控制台的线程,所以扫描程序不喜欢您敢停止它。

您只需捕获它以退出应用程序:

代码语言:javascript
运行
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58509682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档