在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中的错误吗?
答案 0 :(得分:0)
使用Spring Boot v2.2.0.RELEASE,从maven插件启动时,默认情况下启用JVM进程分叉:
目前,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,然后调试器将连接到正确的子进程。
其他参考:
答案 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。