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)
Bruno De Freitas Barros
źródło
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.

Phil Webb
źródło
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.

RichN
źródło
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");
xbranko
źródło
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 ...

Dan Thomas
źródło
1

Spróbuj uruchomić devtools w czasie wykonywania zakresu:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
ra1729
źródło