Use context class loader instead of one-off for command location
This works, and feels like the right thing to do, since there is no guarantee that extensions won't in turn use ServiceLoader for things that we haven't yet anticipated. Fixes gh-6829. Cc @wilkinsona in case he has an opinion.
This commit is contained in:
parent
b446505cef
commit
b5294a48b2
|
@ -31,6 +31,7 @@ import org.springframework.boot.cli.command.core.HintCommand;
|
|||
import org.springframework.boot.cli.command.core.VersionCommand;
|
||||
import org.springframework.boot.cli.command.shell.ShellCommand;
|
||||
import org.springframework.boot.loader.tools.LogbackInitializer;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.SystemPropertyUtils;
|
||||
|
||||
/**
|
||||
|
@ -51,6 +52,7 @@ public final class SpringCli {
|
|||
LogbackInitializer.initialize();
|
||||
|
||||
CommandRunner runner = new CommandRunner("spring");
|
||||
ClassUtils.overrideThreadContextClassLoader(createExtendedClassLoader(runner));
|
||||
runner.addCommand(new HelpCommand(runner));
|
||||
addServiceLoaderCommands(runner);
|
||||
runner.addCommand(new ShellCommand());
|
||||
|
@ -66,14 +68,14 @@ public final class SpringCli {
|
|||
}
|
||||
|
||||
private static void addServiceLoaderCommands(CommandRunner runner) {
|
||||
ServiceLoader<CommandFactory> factories = ServiceLoader.load(CommandFactory.class,
|
||||
createCommandClassLoader(runner));
|
||||
ServiceLoader<CommandFactory> factories = ServiceLoader
|
||||
.load(CommandFactory.class);
|
||||
for (CommandFactory factory : factories) {
|
||||
runner.addCommands(factory.getCommands());
|
||||
}
|
||||
}
|
||||
|
||||
private static URLClassLoader createCommandClassLoader(CommandRunner runner) {
|
||||
private static URLClassLoader createExtendedClassLoader(CommandRunner runner) {
|
||||
return new URLClassLoader(getExtensionURLs(), runner.getClass().getClassLoader());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue