Punkt przerwania w „wyrzuć nowy SilentExitException ()” w Eclipse + Spring Boot


83

Za każdym razem, gdy uruchamiam projekt Spring Boot w trybie debugowania w Eclipse IDE (Spring Tool Suite), wątek zatrzymuje się na throw new SilentExitException();linii nawet bez punktu przerwania.

Czy jest jakieś rozwiązanie, aby uniknąć tego zachowania?

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

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

Zaczyna się to po aktualizacji do 1.3.0 Milestones.

Spring Tool Suite

Version: 3.7.0.RELEASE
Build Id: 201506290649

Platforma:

Eclipse Luna SR2 (4.4.2)

2
Dla użytkowników IntelliJ, którzy wylądowali w tym miejscu: Dodaj warunek do punktu przerwania w Run | Wyświetl punkty przerwania ... | Wszelkie wyjątki: return !(this instanceof org.springframework.boot.devtools.restart.SilentExitExceptionHandler.SilentExitException);musi to być Java, nawet jeśli tworzysz w innym języku JVM.
Marco Eckstein

Odpowiedzi:


127

Jest to niestety znany problem z nowym spring-boot-devtoolsmodułem (patrz https://github.com/spring-projects/spring-boot/issues/3100 ). Używamy tej sztuczki, aby zabić główny wątek, abyśmy mogli go zastąpić wersją do ponownego załadowania. Jak dotąd nie znalazłem sposobu, aby zapobiec wyzwalaniu punktu przerwania debugowania.

Na razie możesz przełączyć pole wyboru „wstrzymaj wykonywanie przy niewyłapanych wyjątkach” w Javie -> Preferencje debugowania, aby temu zapobiec.


6
Ten problem niestety nadal występuje.
Stefan Falk

1
Ten problem jest nadal obecny.
nabster

1
nadal obecny: p
Sachin Sharma

2
Ten problem nadal występuje. przy użyciu wersji Eclipse: 2019-06 (4.12.0) i spring-boot 2.0.6. Okno-> Preferencje -.> Java -> Debig -> niezaznaczone „Wstrzymaj wykonywanie w przypadku nieprzechwyconych wyjątków”
src3369

Nadal obecny z wersją Eclipse 2020-03 (4.15.0) i spring-boot 2.3.1
HDJEMAI

11

Ponieważ tryb Eclipse on Debug pozwala już na ograniczone hotpatching, przeładowywanie przez większość czasu przynosi efekt przeciwny do zamierzonego, więc zdecydowałem się go wyłączyć przez:

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

Źródła: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart-disable

Ponieważ ten wyjątek jest generowany przez urządzenie przeładowujące, rozwiązuje to również ten problem. Pamiętaj, że będziesz musiał użyć tej System.setPropertymetody zamiast ją ustawiać application.properties.


8

Dodaj właściwość jako argument maszyny wirtualnej w konfiguracji, na przykład:

wprowadź opis obrazu tutaj

Dzięki temu nie musisz zmieniać swojego kodu, jak ma to miejsce w przypadku korzystania z:

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

Z innych opcji użyłem tego. Wielkie dzięki za uprzyjemnienie mi dnia!
sivakadi

2

Moje obejście:

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

Nie ma znaczenia, że ​​zignorujemy, SilentExitExceptionponieważ devtools właśnie restartują instancję, SilentExitExceptionktóra nie jest zbyt cicha. Ten blok próbny uciszy go ...

Musiałem użyć dopasowywania tekstu na zajęciach, ponieważ SilentExitExceptionjest prywatny SilentExitExceptionHandler.

To nie rozwiązuje twojego problemu z punktem przerwania ...


1

Spróbuj uruchomić devtools w czasie wykonywania zakresu:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.