From 27715dee202af68dbb0d559196ab4a438d90aafb Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 24 Sep 2025 16:38:44 -0700 Subject: [PATCH] Allow jars to be marked as a development-tool to exclude from uber-jar Closes gh-47320 --- .../springframework/boot/gradle/plugin/JarTypeFileSpec.java | 3 +-- .../tasks/bundling/AbstractBootArchiveIntegrationTests.java | 5 +++++ .../java/org/springframework/boot/maven/JarTypeFilter.java | 4 ++-- .../org/springframework/boot/maven/JarTypeFilterTests.java | 5 +++++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JarTypeFileSpec.java b/build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JarTypeFileSpec.java index eab3f3d2473..ca1b75877d0 100644 --- a/build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JarTypeFileSpec.java +++ b/build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JarTypeFileSpec.java @@ -17,7 +17,6 @@ package org.springframework.boot.gradle.plugin; import java.io.File; -import java.util.Collections; import java.util.Set; import java.util.jar.JarFile; @@ -33,7 +32,7 @@ import org.gradle.api.specs.Spec; */ class JarTypeFileSpec implements Spec { - private static final Set EXCLUDED_JAR_TYPES = Collections.singleton("dependencies-starter"); + private static final Set EXCLUDED_JAR_TYPES = Set.of("dependencies-starter", "development-tool"); @Override public boolean isSatisfiedBy(File file) { diff --git a/build-plugin/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java b/build-plugin/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java index 43c30e37f2a..42ad5f82845 100644 --- a/build-plugin/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java +++ b/build-plugin/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java @@ -283,6 +283,7 @@ abstract class AbstractBootArchiveIntegrationTests { void jarTypeFilteringIsApplied() throws IOException { File flatDirRepository = new File(this.gradleBuild.getProjectDir(), "repository"); createDependenciesStarterJar(new File(flatDirRepository, "starter.jar")); + createDependenciesDeveloperToolsJar(new File(flatDirRepository, "devonly.jar")); createStandardJar(new File(flatDirRepository, "standard.jar")); assertThat(this.gradleBuild.build(this.taskName).task(":" + this.taskName).getOutcome()) .isEqualTo(TaskOutcome.SUCCESS); @@ -659,6 +660,10 @@ abstract class AbstractBootArchiveIntegrationTests { createJar(location, (attributes) -> attributes.putValue("Spring-Boot-Jar-Type", "dependencies-starter")); } + private void createDependenciesDeveloperToolsJar(File location) throws IOException { + createJar(location, (attributes) -> attributes.putValue("Spring-Boot-Jar-Type", "development-tool")); + } + private void createJar(File location, Consumer attributesConfigurer) throws IOException { location.getParentFile().mkdirs(); Manifest manifest = new Manifest(); diff --git a/build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/JarTypeFilter.java b/build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/JarTypeFilter.java index c9b0765ebaf..445debcb673 100644 --- a/build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/JarTypeFilter.java +++ b/build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/JarTypeFilter.java @@ -34,8 +34,8 @@ import org.apache.maven.artifact.Artifact; */ class JarTypeFilter extends DependencyFilter { - private static final Set EXCLUDED_JAR_TYPES = Collections - .unmodifiableSet(new HashSet<>(Arrays.asList("annotation-processor", "dependencies-starter"))); + private static final Set EXCLUDED_JAR_TYPES = Collections.unmodifiableSet( + new HashSet<>(Arrays.asList("annotation-processor", "dependencies-starter", "development-tool"))); JarTypeFilter() { super(Collections.emptyList()); diff --git a/build-plugin/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/JarTypeFilterTests.java b/build-plugin/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/JarTypeFilterTests.java index 382dca1d30f..39e60b53751 100644 --- a/build-plugin/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/JarTypeFilterTests.java +++ b/build-plugin/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/JarTypeFilterTests.java @@ -60,6 +60,11 @@ class JarTypeFilterTests { assertThat(new JarTypeFilter().filter(createArtifact("annotation-processor"))).isTrue(); } + @Test + void whenArtifactHasDevelopmentToolJarTypeThenItIsExcluded() { + assertThat(new JarTypeFilter().filter(createArtifact("development-tool"))).isTrue(); + } + @Test void whenArtifactHasNoManifestFileThenItIsIncluded() { assertThat(new JarTypeFilter().filter(createArtifactWithNoManifest())).isFalse();