Commit a95a7e3d authored by Andy Wilkinson's avatar Andy Wilkinson

Allow restart to be enabled when CL not named AppClassLoader

Previously, the restart initializer that enables restart when
-Dspring.devtools.restart.enabled=true is set had no effect when the
ClassLoader's name did not contain AppClassLoader. This commit updates
RestartApplicationListener to use the correct RestartInitializer when
the system property has forcibly enabled restart.

When restart is enabled a SilentExitException is thrown and it should be
caught and handled by the SilentExitExceptionHandler. When the
application is invoked via one of the loader's LauncherClasses
reflection is used and this exception becomes wrapped in an
InvocationTargetEception. Previously, this wrapping prevented
SilentExitExceptionHandler from handling the exception. This commit
updates the handler to look for an InvocationTargetException with a
SilentExitException target in addition to continuing to look for a
SilentExitException directly.

Fixes gh-24797
parent 26f143b8
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -83,12 +83,11 @@ public class RestartApplicationListener implements ApplicationListener<Applicati ...@@ -83,12 +83,11 @@ public class RestartApplicationListener implements ApplicationListener<Applicati
} }
if (restartInitializer != null) { if (restartInitializer != null) {
String[] args = event.getArgs(); String[] args = event.getArgs();
DefaultRestartInitializer initializer = new DefaultRestartInitializer();
boolean restartOnInitialize = !AgentReloader.isActive(); boolean restartOnInitialize = !AgentReloader.isActive();
if (!restartOnInitialize) { if (!restartOnInitialize) {
logger.info("Restart disabled due to an agent-based reloader being active"); logger.info("Restart disabled due to an agent-based reloader being active");
} }
Restarter.initialize(args, false, initializer, restartOnInitialize); Restarter.initialize(args, false, restartInitializer, restartOnInitialize);
} }
else { else {
logger.info(LogMessage.format("Restart disabled due to System property '%s' being set to false", logger.info(LogMessage.format("Restart disabled due to System property '%s' being set to false",
......
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
package org.springframework.boot.devtools.restart; package org.springframework.boot.devtools.restart;
import java.lang.Thread.UncaughtExceptionHandler; import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays; import java.util.Arrays;
/** /**
...@@ -35,7 +36,8 @@ class SilentExitExceptionHandler implements UncaughtExceptionHandler { ...@@ -35,7 +36,8 @@ class SilentExitExceptionHandler implements UncaughtExceptionHandler {
@Override @Override
public void uncaughtException(Thread thread, Throwable exception) { public void uncaughtException(Thread thread, Throwable exception) {
if (exception instanceof SilentExitException) { if (exception instanceof SilentExitException || (exception instanceof InvocationTargetException
&& ((InvocationTargetException) exception).getTargetException() instanceof SilentExitException)) {
if (isJvmExiting(thread)) { if (isJvmExiting(thread)) {
preventNonZeroExitCode(); preventNonZeroExitCode();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment