From 5150e051c0ea8226d50934e1aef9b28ac5e88ef9 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 14 Oct 2015 01:31:10 -0700 Subject: [PATCH] Allow remote restart to work with nested JARs Update remote restart support so that JARs multi-module projects work. Fixes gh-4040 --- .../boot/devtools/restart/Restarter.java | 2 +- .../server/DefaultSourceFolderUrlFilter.java | 10 +++++++++- .../DefaultSourceFolderUrlFilterTests.java | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/restart/Restarter.java b/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/restart/Restarter.java index 19aad9ee5a..6931a68af9 100644 --- a/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/restart/Restarter.java +++ b/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/restart/Restarter.java @@ -204,7 +204,7 @@ public class Restarter { */ public void addUrls(Collection urls) { Assert.notNull(urls, "Urls must not be null"); - this.urls.addAll(ChangeableUrls.fromUrls(urls).toList()); + this.urls.addAll(urls); } /** diff --git a/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/restart/server/DefaultSourceFolderUrlFilter.java b/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/restart/server/DefaultSourceFolderUrlFilter.java index e863491128..24549a20b9 100644 --- a/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/restart/server/DefaultSourceFolderUrlFilter.java +++ b/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/restart/server/DefaultSourceFolderUrlFilter.java @@ -17,6 +17,9 @@ package org.springframework.boot.devtools.restart.server; import java.net.URL; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -38,6 +41,11 @@ public class DefaultSourceFolderUrlFilter implements SourceFolderUrlFilter { private static final Pattern VERSION_PATTERN = Pattern .compile("^-\\d+(?:\\.\\d+)*(?:[.-].+)?$"); + private static final Set SKIPPED_PROJECTS = new HashSet( + Arrays.asList("spring-boot", "spring-boot-devtools", + "spring-boot-autoconfigure", "spring-boot-actuator", + "spring-boot-starter")); + @Override public boolean isMatch(String sourceFolder, URL url) { String jarName = getJarName(url); @@ -68,7 +76,7 @@ public class DefaultSourceFolderUrlFilter implements SourceFolderUrlFilter { } private boolean isFolderMatch(String folder, String jarName) { - if (!jarName.startsWith(folder)) { + if (!jarName.startsWith(folder) || SKIPPED_PROJECTS.contains(folder)) { return false; } String version = jarName.substring(folder.length()); diff --git a/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/server/DefaultSourceFolderUrlFilterTests.java b/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/server/DefaultSourceFolderUrlFilterTests.java index 11e3c79e2e..4b6e9549b4 100644 --- a/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/server/DefaultSourceFolderUrlFilterTests.java +++ b/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/server/DefaultSourceFolderUrlFilterTests.java @@ -70,6 +70,22 @@ public class DefaultSourceFolderUrlFilterTests { doTest("my-module/something/quite/quite/mad/"); } + @Test + public void skippedProjects() throws Exception { + String sourceFolder = "/Users/me/code/spring-boot-samples/" + + "spring-boot-sample-devtools"; + URL jarUrl = new URL("jar:file:/Users/me/tmp/" + + "spring-boot-sample-devtools-1.3.0.BUILD-SNAPSHOT.jar!/"); + assertThat(this.filter.isMatch(sourceFolder, jarUrl), equalTo(true)); + URL nestedJarUrl = new URL("jar:file:/Users/me/tmp/" + + "spring-boot-sample-devtools-1.3.0.BUILD-SNAPSHOT.jar!/" + + "lib/spring-boot-1.3.0.BUILD-SNAPSHOT.jar!/"); + assertThat(this.filter.isMatch(sourceFolder, nestedJarUrl), equalTo(false)); + URL fileUrl = new URL("file:/Users/me/tmp/" + + "spring-boot-sample-devtools-1.3.0.BUILD-SNAPSHOT.jar"); + assertThat(this.filter.isMatch(sourceFolder, fileUrl), equalTo(true)); + } + private void doTest(String sourcePostfix) throws MalformedURLException { doTest(sourcePostfix, "my-module", true); doTest(sourcePostfix, "my-module-other", false);