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)
java
eclipse
spring-boot
breakpoints
Bruno De Freitas Barros
źródło
źródło
return !(this instanceof org.springframework.boot.devtools.restart.SilentExitExceptionHandler.SilentExitException);
musi to być Java, nawet jeśli tworzysz w innym języku JVM.Odpowiedzi:
Jest to niestety znany problem z nowym
spring-boot-devtools
moduł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.
źródło
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.setProperty
metody zamiast ją ustawiaćapplication.properties
.źródło
Dodaj właściwość jako argument maszyny wirtualnej w konfiguracji, na przykład:
Dzięki temu nie musisz zmieniać swojego kodu, jak ma to miejsce w przypadku korzystania z:
System.setProperty("spring.devtools.restart.enabled", "false");
źródło
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,
SilentExitException
ponieważ devtools właśnie restartują instancję,SilentExitException
która nie jest zbyt cicha. Ten blok próbny uciszy go ...Musiałem użyć dopasowywania tekstu na zajęciach, ponieważ
SilentExitException
jest prywatnySilentExitExceptionHandler
.To nie rozwiązuje twojego problemu z punktem przerwania ...
źródło
Spróbuj uruchomić devtools w czasie wykonywania zakresu:
źródło