diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/run/SpringApplicationRunner.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/run/SpringApplicationRunner.java index 2796029ca1..909ab69f70 100644 --- a/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/run/SpringApplicationRunner.java +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/run/SpringApplicationRunner.java @@ -18,10 +18,15 @@ package org.springframework.boot.cli.command.run; import java.io.File; import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import org.springframework.boot.cli.compiler.GroovyCompiler; +import org.springframework.boot.cli.util.ResourceUtils; /** * Compiles Groovy code running the resulting classes using a {@code SpringApplication}. @@ -83,11 +88,6 @@ public class SpringApplicationRunner { throw new RuntimeException("No classes found in '" + this.sources + "'"); } - // Run in new thread to ensure that the context classloader is setup - this.runThread = new RunThread(compiledSources); - this.runThread.start(); - this.runThread.join(); - // Start monitoring for changes if (this.fileWatchThread == null && this.configuration.isWatchForFileChanges()) { @@ -95,6 +95,10 @@ public class SpringApplicationRunner { this.fileWatchThread.start(); } + // Run in new thread to ensure that the context classloader is setup + this.runThread = new RunThread(compiledSources); + this.runThread.start(); + this.runThread.join(); } catch (Exception ex) { if (this.fileWatchThread == null) { @@ -173,11 +177,13 @@ public class SpringApplicationRunner { private long previous; + private List sources; + public FileWatchThread() { super("filewatcher-" + (watcherCounter++)); this.previous = 0; - for (String path : SpringApplicationRunner.this.sources) { - File file = new File(path); + this.sources = getSourceFiles(); + for (File file : this.sources) { if (file.exists()) { long current = file.lastModified(); if (current > this.previous) { @@ -188,13 +194,32 @@ public class SpringApplicationRunner { setDaemon(false); } + private List getSourceFiles() { + List sources = new ArrayList(); + for (String source : SpringApplicationRunner.this.sources) { + List paths = ResourceUtils.getUrls(source, + SpringApplicationRunner.this.compiler.getLoader()); + for (String path : paths) { + try { + URL url = new URL(path); + if ("file".equals(url.getProtocol())) { + sources.add(new File(url.getFile())); + } + } + catch (MalformedURLException ex) { + // Ignore + } + } + } + return sources; + } + @Override public void run() { while (true) { try { Thread.sleep(TimeUnit.SECONDS.toMillis(1)); - for (String path : SpringApplicationRunner.this.sources) { - File file = new File(path); + for (File file : this.sources) { if (file.exists()) { long current = file.lastModified(); if (this.previous < current) {