Точка зупинки при “киньте новий 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.

Весняний набір інструментів

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
Сачин Шарма

2
Ця проблема все ще присутня. за допомогою версії Eclipse: 2019-06 (4.12.0) та spring-boot 2.0.6. Вікно-> Налаштування -.> Java -> Debig -> знято прапорець "Призупинити виконання на незахоплених винятках"
src3369

Все ще присутній у версії Eclipse 2020-03 (4.15.0) та spring-boot 2.3.1
HDJEMAI

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

Додайте властивість як аргумент VM у конфігурації, наприклад:

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

Таким чином, вам не доведеться змінювати свій код, як це буває при використанні:

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тому що devtools просто перезапускають екземпляр за допомогою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.