Breakpoint at “throw new SilentExitException()” in

2020-05-15 08:18发布

Everytime I run my Spring Boot project on debug mode in Eclipse IDE (Spring Tool Suite), the thread stops at "throw new SilentExitException();" line even without a breakpoint.

Some solution to avoid this behavior?

org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread() (line 53):

public static void exitCurrentThread() {
    throw new SilentExitException();
}

This starts happening after upgrade to 1.3.0 Milestones.

Spring Tool Suite Version: 3.7.0.RELEASE Build Id: 201506290649 Platform: Eclipse Luna SR2 (4.4.2)

5条回答
家丑人穷心不美
2楼-- · 2020-05-15 08:19

Try to run devtools at scope runtime:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
查看更多
我想做一个坏孩纸
3楼-- · 2020-05-15 08:23

Add the property as a VM argument in the configuration like:

enter image description here

That way you don't have to change your code, as it is the case when using:

System.setProperty("spring.devtools.restart.enabled", "false");
查看更多
We Are One
4楼-- · 2020-05-15 08:28

This is unfortunately a know issue with the new spring-boot-devtools module (see https://github.com/spring-projects/spring-boot/issues/3100). We use this trick to kill the main thread so that we can replace it with a re-loadable version. So far I've not found a way to prevent the debug breakpoint from triggering.

For now, you can toggle the "suspend execution on uncaught exceptions" checkbox in Java -> Debug preferences to prevent it from happening.

查看更多
▲ chillily
5楼-- · 2020-05-15 08:35

As Eclipse on Debug mode already allows limited hotpatching, I find the reloader to be counterproductive most of the time and so I decided to disable it by:

System.setProperty("spring.devtools.restart.enabled", "false");

Reference: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart-disable

Since that exception is thrown by the reloader, this also solves this issue. Note that you'll have to use the System.setProperty method instead of setting it in application.properties.

查看更多
闹够了就滚
6楼-- · 2020-05-15 08:44

My workaround:

public static void main(String[] args) {
    try {
        SpringApplication.run(App.class, args);
    } catch (Throwable e) {
        if(e.getClass().getName().contains("SilentExitException")) {
            LOGGER.debug("Spring is restarting the main thread - See spring-boot-devtools");
        } else {
            LOGGER.error("Application crashed!", e);
        }
    }
}

It doesn't matter that we ignore the SilentExitException because the devtools are just restarting the instance with a SilentExitException which isn't very silent. This try block will silence it...

I had to use text matching on the class as the SilentExitException is private in SilentExitExceptionHandler.

It doesn't solve your problem with the breakpoint...

查看更多
登录 后发表回答