Breakpoint at "throw new SilentExitException()" in Eclipse + Spring Boot

JavaEclipseSpring BootBreakpointsSpring Tool-Suite

Java Problem Overview


Every time I run my Spring Boot project on debug mode in Eclipse IDE (Spring Tool Suite), the thread stops at throw new SilentExitException(); line even without a breakpoint.

Is there some solution to avoid this behavior?

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

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

This starts happening after upgrade to 1.3.0 Milestones.

Spring Tool Suite

Version: 3.7.0.RELEASE
Build Id: 201506290649

Platform:

Eclipse Luna SR2 (4.4.2)

Java Solutions


Solution 1 - Java

This is unfortunately a know issue with the new spring-boot-devtools module (see https://github.com/spring-projects/spring-boot/issues/3100). We use this trick to kill the main thread so that we can replace it with a re-loadable version. So far I've not found a way to prevent the debug breakpoint from triggering.

For now, you can toggle the "suspend execution on uncaught exceptions" checkbox in Java -> Debug preferences to prevent it from happening.

Solution 2 - Java

Add the property as a VM argument:

-Dspring.devtools.restart.enabled=false

enter image description here

That way you don't have to change your code, as it is the case when using:

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

Solution 3 - Java

As Eclipse on Debug mode already allows limited hotpatching, I find the reloader to be counterproductive most of the time and so I decided to disable it by:

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

Reference: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart-disable

Since that exception is thrown by the reloader, this also solves this issue. Note that you'll have to use the System.setProperty method instead of setting it in application.properties.

Solution 4 - Java

My workaround:

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

It doesn't matter that we ignore the SilentExitException because the devtools are just restarting the instance with a SilentExitException which isn't very silent. This try block will silence it...

I had to use text matching on the class as the SilentExitException is private in SilentExitExceptionHandler.

It doesn't solve your problem with the breakpoint...

Solution 5 - Java

Try to run devtools at scope runtime:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

Solution 6 - Java

I had same issue while running spring boot project. I found TRY CATCH block used in Main method.

Remove the try catch block run the code. that error will not come again. like below:

public static void main(String[] args) {

	SpringApplication.run(TrewAuthApplication.class, args);

}

Solution 7 - Java

Delete these to Unknown Exceptions & it won't break there: enter image description here

Unfortunately, I haven't found a way for this to be permanent, but it should last till the next time you restart eclipse.

Solution 8 - Java

Set this in your application.properties file to true.

spring.devtools.restart.enabled=false

Also go sure that if you use a spring cloud config server, there is no propertie file that enables this.

Solution 9 - Java

My workaround in Kotlin:

@JvmStatic
fun main(args: Array<String>) {
  val app = SpringApplication(Application::class.java)
  try {
    app.run(*args)
  } catch (e: Exception) {
    preventNonNullExitCodeOnSilentExitException(e)
  }
}

private fun preventNonNullExitCodeOnSilentExitException(e: Exception) {
  if (e.toString().contains("SilentExitException")) {
    log.info("Ignoring Silent Exit Exception...")
    e.printStackTrace()
    return
  }
  throw e
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBruno De Freitas BarrosView Question on Stackoverflow
Solution 1 - JavaPhil WebbView Answer on Stackoverflow
Solution 2 - JavaxbrankoView Answer on Stackoverflow
Solution 3 - JavaRichNView Answer on Stackoverflow
Solution 4 - JavaDan ThomasView Answer on Stackoverflow
Solution 5 - Javara1729View Answer on Stackoverflow
Solution 6 - JavaHameed RiswanView Answer on Stackoverflow
Solution 7 - JavaScrappyDevView Answer on Stackoverflow
Solution 8 - JavaTristateView Answer on Stackoverflow
Solution 9 - JavaJan CizmarView Answer on Stackoverflow