Cada vez que ejecuto mi proyecto Spring Boot en modo de depuración en Eclipse IDE (Spring Tool Suite), el hilo se detiene en la throw new SilentExitException();
línea incluso sin un punto de interrupción.
¿Existe alguna solución para evitar este comportamiento?
org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread() (line 53):
public static void exitCurrentThread() {
throw new SilentExitException();
}
Esto comienza a suceder después de la actualización a 1.3.0 Milestones.
Conjunto de herramientas Spring
Version: 3.7.0.RELEASE
Build Id: 201506290649
Plataforma:
Eclipse Luna SR2 (4.4.2)
java
eclipse
spring-boot
breakpoints
Bruno De Freitas Barros
fuente
fuente
return !(this instanceof org.springframework.boot.devtools.restart.SilentExitExceptionHandler.SilentExitException);
debe ser Java incluso si se desarrolla en otro lenguaje JVM.Respuestas:
Desafortunadamente, este es un problema conocido con el nuevo
spring-boot-devtools
módulo (consulte https://github.com/spring-projects/spring-boot/issues/3100 ). Usamos este truco para matar el hilo principal de modo que podamos reemplazarlo con una versión recargable. Hasta ahora no he encontrado una manera de evitar que se active el punto de interrupción de depuración.Por ahora, puede alternar la casilla de verificación "suspender la ejecución en excepciones no detectadas" en Java -> Preferencias de depuración para evitar que suceda.
fuente
Como Eclipse en el modo de depuración ya permite un parche en caliente limitado, encuentro que el recargador es contraproducente la mayor parte del tiempo y decidí deshabilitarlo de la siguiente manera:
System.setProperty("spring.devtools.restart.enabled", "false");
Referencia: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart-disable
Dado que el cargador lanza esa excepción, esto también resuelve este problema. Tenga en cuenta que tendrá que usar el
System.setProperty
método en lugar de configurarloapplication.properties
.fuente
Agregue la propiedad como un argumento de VM en la configuración como:
De esa manera, no tiene que cambiar su código, como es el caso cuando usa:
System.setProperty("spring.devtools.restart.enabled", "false");
fuente
Mi solución:
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); } } }
No importa que ignoremos
SilentExitException
porque las devtools solo están reiniciando la instancia con unSilentExitException
que no es muy silencioso. Este bloque de prueba lo silenciará ...Tuve que usar la coincidencia de texto en la clase ya que
SilentExitException
es privado enSilentExitExceptionHandler
.No resuelve tu problema con el punto de interrupción ...
fuente
Intente ejecutar devtools en el tiempo de ejecución del alcance:
fuente