diff --git a/first-party/jib-spring-boot-extension-maven/gradle.properties b/first-party/jib-spring-boot-extension-maven/gradle.properties index da3fb3f..2c4734b 100644 --- a/first-party/jib-spring-boot-extension-maven/gradle.properties +++ b/first-party/jib-spring-boot-extension-maven/gradle.properties @@ -1 +1 @@ -version = 0.1.0-SNAPSHOT +version = 0.1.1 diff --git a/first-party/jib-spring-boot-extension-maven/src/main/java/com/google/cloud/tools/jib/maven/extension/springboot/JibSpringBootExtension.java b/first-party/jib-spring-boot-extension-maven/src/main/java/com/google/cloud/tools/jib/maven/extension/springboot/JibSpringBootExtension.java index d72aba6..a6af72e 100644 --- a/first-party/jib-spring-boot-extension-maven/src/main/java/com/google/cloud/tools/jib/maven/extension/springboot/JibSpringBootExtension.java +++ b/first-party/jib-spring-boot-extension-maven/src/main/java/com/google/cloud/tools/jib/maven/extension/springboot/JibSpringBootExtension.java @@ -28,9 +28,7 @@ import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; import com.google.common.annotations.VisibleForTesting; import java.io.File; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; import org.apache.maven.model.Plugin; @@ -54,58 +52,70 @@ public ContainerBuildPlan extendContainerBuildPlan( throws JibPluginExtensionException { logger.log(LogLevel.LIFECYCLE, "Running Jib Spring Boot extension"); - if (!shouldExcludeDevtools(mavenData.getMavenProject(), logger)) { - logger.log(LogLevel.INFO, "Keeping spring-boot-devtools (if any)"); + List exclusions = excludeDependencies(mavenData.getMavenProject(), logger); + if (exclusions == null || exclusions.isEmpty()) { + logger.log(LogLevel.INFO, "Keeping dependencies (if any)"); return buildPlan; } - logger.log(LogLevel.INFO, "Removing spring-boot-devtools (if any)"); + logger.log(LogLevel.INFO, "Removing dependencies (if any)"); List newLayers = - buildPlan - .getLayers() - .stream() - .map(JibSpringBootExtension::filterOutDevtools) + buildPlan.getLayers().stream() + .map(layerObject -> filterOutDependencies(layerObject, exclusions)) .collect(Collectors.toList()); return buildPlan.toBuilder().setLayers(newLayers).build(); } @VisibleForTesting - static boolean isDevtoolsJar(File file) { - return file.getName().startsWith("spring-boot-devtools-") && file.getName().endsWith(".jar"); + static boolean isDependencyJar(File file, List exclusions) { + return exclusions.stream().anyMatch(e -> file.getName().startsWith(e)) && file.getName().endsWith(".jar"); } @VisibleForTesting - static boolean shouldExcludeDevtools(MavenProject project, ExtensionLogger logger) { + static List excludeDependencies(MavenProject project, ExtensionLogger logger) { + List exclusions = new ArrayList<>(); + Plugin bootPlugin = project.getPlugin("org.springframework.boot:spring-boot-maven-plugin"); if (bootPlugin == null) { logger.log( LogLevel.WARN, "Jib Spring Boot extension: project doesn't have spring-boot-maven-plugin?"); - return true; + return exclusions; } Xpp3Dom configuration = (Xpp3Dom) bootPlugin.getConfiguration(); if (configuration != null) { Xpp3Dom excludeDevtools = configuration.getChild("excludeDevtools"); if (excludeDevtools != null) { - return "true".equalsIgnoreCase(excludeDevtools.getValue()); + if ("true".equalsIgnoreCase(excludeDevtools.getValue())) { + exclusions.add("spring-boot-devtools-"); + } + } + Xpp3Dom excludes = configuration.getChild("excludes"); + if (excludes != null && excludes.getChildCount() > 0) { + for (Xpp3Dom child:excludes.getChildren()) { + exclusions.add(String.format("%s-", child.getChild("artifactId").getValue())); + } } } - return true; // Spring Boot's default is true. + + // no dependencies or devtools need to be excluded + return exclusions; } @VisibleForTesting - static LayerObject filterOutDevtools(LayerObject layerObject) { - String dependencyLayerName = JavaContainerBuilder.LayerType.DEPENDENCIES.getName(); - if (!dependencyLayerName.equals(layerObject.getName())) { + static LayerObject filterOutDependencies(LayerObject layerObject, List exclusions) { + // skip non-dependencies and non-project_dependencies layers + if (!Objects.equals(JavaContainerBuilder.LayerType.DEPENDENCIES.getName(), layerObject.getName()) + && !Objects.equals(JavaContainerBuilder.LayerType.PROJECT_DEPENDENCIES.getName(), layerObject.getName())) { return layerObject; } FileEntriesLayer layer = (FileEntriesLayer) layerObject; - Predicate notDevtoolsJar = - fileEntry -> !isDevtoolsJar(fileEntry.getSourceFile().toFile()); + Predicate notDependencyJar = + fileEntry -> !isDependencyJar(fileEntry.getSourceFile().toFile(), exclusions); List newEntries = - layer.getEntries().stream().filter(notDevtoolsJar).collect(Collectors.toList()); + layer.getEntries().stream().filter(notDependencyJar).collect(Collectors.toList()); return layer.toBuilder().setEntries(newEntries).build(); } } diff --git a/first-party/jib-spring-boot-extension-maven/src/test/java/com/google/cloud/tools/jib/maven/extension/springboot/JibSpringBootExtensionTest.java b/first-party/jib-spring-boot-extension-maven/src/test/java/com/google/cloud/tools/jib/maven/extension/springboot/JibSpringBootExtensionTest.java index b53156b..18bfa8f 100644 --- a/first-party/jib-spring-boot-extension-maven/src/test/java/com/google/cloud/tools/jib/maven/extension/springboot/JibSpringBootExtensionTest.java +++ b/first-party/jib-spring-boot-extension-maven/src/test/java/com/google/cloud/tools/jib/maven/extension/springboot/JibSpringBootExtensionTest.java @@ -34,6 +34,7 @@ import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -66,9 +67,7 @@ private static FileEntriesLayer buildLayer(String layerName, Path... paths) { } private static List layerToExtractionPaths(FileEntriesLayer layer) { - return layer - .getEntries() - .stream() + return layer.getEntries().stream() .map(layerEntry -> layerEntry.getExtractionPath().toString()) .collect(Collectors.toList()); } @@ -81,24 +80,30 @@ public void setUp() { @Test public void testIsDevtoolsJar() { File file = Paths.get("sub", "folder", "spring-boot-devtools-1.2.3-SNAPSHOT.jar").toFile(); - assertTrue(JibSpringBootExtension.isDevtoolsJar(file)); + List exclusions = new ArrayList<>(); + exclusions.add("spring-boot-devtools-"); + assertTrue(JibSpringBootExtension.isDependencyJar(file, exclusions)); } @Test public void testIsDevtoolsJar_noJarExtension() { File file = Paths.get("sub", "folder", "spring-boot-devtools-1.2.3-SNAPSHOT").toFile(); - assertFalse(JibSpringBootExtension.isDevtoolsJar(file)); + List exclusions = new ArrayList<>(); + assertFalse(JibSpringBootExtension.isDependencyJar(file, exclusions)); } @Test public void testIsDevtoolsJar_differentJar() { File file = Paths.get("sub", "folder", "not-spring-boot-devtools-1.2.3-SNAPSHOT.jar").toFile(); - assertFalse(JibSpringBootExtension.isDevtoolsJar(file)); + List exclusions = new ArrayList<>(); + exclusions.add("spring-boot-devtools-"); + assertFalse(JibSpringBootExtension.isDependencyJar(file, exclusions)); } @Test public void testShouldExcludeDevtools_noSpringBootPlugin() { - assertTrue(JibSpringBootExtension.shouldExcludeDevtools(project, logger)); + List exclusions = new ArrayList<>(); + assertEquals(exclusions, JibSpringBootExtension.excludeDependencies(project, logger)); verify(logger) .log( @@ -111,7 +116,8 @@ public void testShouldExcludeDevtools_trueByDefault() { when(project.getPlugin("org.springframework.boot:spring-boot-maven-plugin")) .thenReturn(bootPlugin); - assertTrue(JibSpringBootExtension.shouldExcludeDevtools(project, logger)); + List exclusions = new ArrayList<>(); + assertEquals(exclusions, JibSpringBootExtension.excludeDependencies(project, logger)); } @Test @@ -125,7 +131,8 @@ public void testShouldExcludeDevtools_false() { .thenReturn(bootPlugin); when(bootPlugin.getConfiguration()).thenReturn(configuration); - assertFalse(JibSpringBootExtension.shouldExcludeDevtools(project, logger)); + List exclusions = new ArrayList<>(); + assertEquals(exclusions, JibSpringBootExtension.excludeDependencies(project, logger)); } @Test @@ -139,7 +146,9 @@ public void testShouldExcludeDevtools_true() { .thenReturn(bootPlugin); when(bootPlugin.getConfiguration()).thenReturn(configuration); - assertTrue(JibSpringBootExtension.shouldExcludeDevtools(project, logger)); + List exclusions = new ArrayList<>(); + exclusions.add("spring-boot-devtools-"); + assertEquals(exclusions, JibSpringBootExtension.excludeDependencies(project, logger)); } @Test @@ -150,7 +159,9 @@ public void testFilterOutDevtools() { Paths.get("static").resolve("foo.txt"), Paths.get("lib").resolve("spring-boot-devtools-1.2.3.jar"), Paths.get("archive").resolve("bar.zip")); - FileEntriesLayer filtered = (FileEntriesLayer) JibSpringBootExtension.filterOutDevtools(layer); + List exclusions = new ArrayList<>(); + exclusions.add("spring-boot-devtools-"); + FileEntriesLayer filtered = (FileEntriesLayer) JibSpringBootExtension.filterOutDependencies(layer, exclusions); assertEquals(Arrays.asList("/dest/foo.txt", "/dest/bar.zip"), layerToExtractionPaths(filtered)); } @@ -162,7 +173,9 @@ public void testFilterOutDevtools_differentDependencyLayerName() { "NOT dependencies", Paths.get("lib").resolve("spring-boot-devtools-1.2.3.jar"), Paths.get("archive").resolve("bar.zip")); - LayerObject newLayer = JibSpringBootExtension.filterOutDevtools(layer); + List exclusions = new ArrayList<>(); + exclusions.add("spring-boot-devtools-"); + LayerObject newLayer = JibSpringBootExtension.filterOutDependencies(layer, exclusions); assertSame(layer, newLayer); assertEquals(layer.getEntries(), ((FileEntriesLayer) newLayer).getEntries()); } @@ -190,11 +203,12 @@ public void testExtendContainerBuildPlan_devtoolsFiltered() throws JibPluginExte FileEntriesLayer newLayer1 = (FileEntriesLayer) newPlan.getLayers().get(0); FileEntriesLayer newLayer2 = (FileEntriesLayer) newPlan.getLayers().get(1); - assertEquals(Arrays.asList("/dest/bar.zip"), layerToExtractionPaths(newLayer1)); + assertEquals(Arrays.asList("/dest/spring-boot-devtools-1.2.3.jar", "/dest/bar.zip"), + layerToExtractionPaths(newLayer1)); assertEquals( Arrays.asList("/dest/spring-boot-devtools-1.2.3.jar"), layerToExtractionPaths(newLayer2)); - verify(logger).log(LogLevel.INFO, "Removing spring-boot-devtools (if any)"); + verify(logger).log(LogLevel.INFO, "Keeping dependencies (if any)"); } @Test @@ -224,6 +238,6 @@ public void testExtendContainerBuildPlan_noFiltering() throws JibPluginExtension .extendContainerBuildPlan(buildPlan, null, Optional.empty(), mavenData, logger); assertSame(buildPlan, newPlan); - verify(logger).log(LogLevel.INFO, "Keeping spring-boot-devtools (if any)"); + verify(logger).log(LogLevel.INFO, "Keeping dependencies (if any)"); } }