Точка останова на «выбросить новое исключение SilentExitException ()» в Eclipse + Spring Boot


83

Каждый раз, когда я запускаю свой проект Spring Boot в режиме отладки в Eclipse IDE (Spring Tool Suite), поток останавливается на throw new SilentExitException();строке даже без точки останова.

Есть ли какое-то решение, чтобы избежать такого поведения?

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

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

Это начинает происходить после обновления до 1.3.0 Milestones.

Набор инструментов Spring

Version: 3.7.0.RELEASE
Build Id: 201506290649

Платформа:

Eclipse Luna SR2 (4.4.2)

2
Для пользователей IntelliJ, попавших сюда: добавьте условие в точку останова в Run | Просмотреть точки останова ... | Любые исключения: return !(this instanceof org.springframework.boot.devtools.restart.SilentExitExceptionHandler.SilentExitException);это должна быть Java, даже если вы разрабатываете на другом языке JVM.
Марко Экштейн

Ответы:


127

К сожалению, это известная проблема с новым spring-boot-devtoolsмодулем (см. Https://github.com/spring-projects/spring-boot/issues/3100 ). Мы используем этот трюк, чтобы убить основной поток, чтобы мы могли заменить его перезагружаемой версией. До сих пор я не нашел способа предотвратить срабатывание точки останова отладки.

На данный момент вы можете переключить флажок «приостанавливать выполнение при неперехваченных исключениях» в настройках Java -> Отладка, чтобы этого не происходило.


6
К сожалению, эта проблема все еще существует.
Стефан Фальк,

1
Эта проблема все еще существует.
nabster

1
все еще присутствует: p
Sachin Sharma

2
Эта проблема все еще существует. с использованием Eclipse версии: 2019-06 (4.12.0) и spring -boot 2.0.6. Окно-> Настройки -.> Java -> Debig -> снят флажок «Приостановить выполнение при неперехваченных исключениях»
src3369 02

Все еще присутствует в Eclipse версии 2020-03 (4.15.0) и spring
-boot

11

Поскольку Eclipse в режиме отладки уже допускает ограниченное горячее исправление, я считаю, что перезагрузчик в большинстве случаев является контрпродуктивным, поэтому я решил отключить его следующим образом:

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

Ссылка: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart-disable

Поскольку это исключение генерируется перезагрузчиком, это также решает эту проблему. Обратите внимание, что вам придется использовать System.setPropertyметод вместо его настройки application.properties.


8

Добавьте свойство в качестве аргумента виртуальной машины в конфигурацию, например:

введите описание изображения здесь

Таким образом, вам не нужно менять свой код, как в случае использования:

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

Из других вариантов я использовал это. Большое спасибо за то, что сделали мой день!
sivakadi

2

Мое решение:

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);
        }
    }
}

Не имеет значения, что мы игнорируем, SilentExitExceptionпотому что инструменты разработчика просто перезапускают экземпляр с помощью, SilentExitExceptionчто не очень тихо. Этот блок попытки заставит его замолчать ...

Мне пришлось использовать сопоставление текста в классе, поскольку он SilentExitExceptionявляется частным SilentExitExceptionHandler.

Это не решает вашу проблему с точкой останова ...


1

Попробуйте запустить devtools во время выполнения области:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.