From 8d118d9d1a02b0745b9d5c265338527225fc32d0 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 15 Nov 2025 20:23:10 +0800 Subject: [PATCH 1/6] New `PatternFilterableResourceTransformer` --- api/shadow.api | 34 +++++++++++-------- .../PatternFilterableResourceTransformer.kt | 18 ++++++++++ .../transformers/ServiceFileTransformer.kt | 18 ++++------ 3 files changed, 43 insertions(+), 27 deletions(-) create mode 100644 src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt diff --git a/api/shadow.api b/api/shadow.api index 5e2efff0c..2b051ba73 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -385,6 +385,24 @@ public class com/github/jengelman/gradle/plugins/shadow/transformers/ManifestRes public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V } +public abstract class com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer, org/gradle/api/tasks/util/PatternFilterable { + public fun ()V + public fun (Lorg/gradle/api/tasks/util/PatternSet;)V + public synthetic fun (Lorg/gradle/api/tasks/util/PatternSet;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun exclude (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun exclude (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun exclude (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun exclude ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun getExcludes ()Ljava/util/Set; + public fun getIncludes ()Ljava/util/Set; + public fun include (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun include (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun include (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun include ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun setExcludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun setIncludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; +} + public class com/github/jengelman/gradle/plugins/shadow/transformers/PreserveFirstFoundResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer { public fun (Lorg/gradle/api/model/ObjectFactory;)V public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z @@ -447,26 +465,12 @@ public final class com/github/jengelman/gradle/plugins/shadow/transformers/Resou public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V } -public class com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer, org/gradle/api/tasks/util/PatternFilterable { +public class com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer { public fun ()V - public fun (Lorg/gradle/api/tasks/util/PatternSet;)V - public synthetic fun (Lorg/gradle/api/tasks/util/PatternSet;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z - public fun exclude (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun exclude (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun exclude (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun exclude ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun getExcludes ()Ljava/util/Set; - public fun getIncludes ()Ljava/util/Set; public fun getPath ()Ljava/lang/String; public fun hasTransformedResource ()Z - public fun include (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun include (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun include (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun include ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun modifyOutputStream (Lorg/apache/tools/zip/ZipOutputStream;Z)V - public fun setExcludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; - public fun setIncludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun setPath (Ljava/lang/String;)V public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt new file mode 100644 index 000000000..992f05092 --- /dev/null +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt @@ -0,0 +1,18 @@ +package com.github.jengelman.gradle.plugins.shadow.transformers + +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.util.PatternFilterable +import org.gradle.api.tasks.util.PatternSet + +public abstract class PatternFilterableResourceTransformer( + @Internal internal val patternSet: PatternSet = PatternSet(), +) : ResourceTransformer, + PatternFilterable by patternSet { + + @Input // Trigger task executions after includes changed. + override fun getIncludes(): MutableSet = patternSet.includes + + @Input // Trigger task executions after excludes changed. + override fun getExcludes(): MutableSet = patternSet.excludes +} diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt index 87e888583..a01f007f4 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt @@ -24,12 +24,12 @@ import org.gradle.api.tasks.util.PatternSet * @author John Engelman */ @CacheableTransformer -public open class ServiceFileTransformer( - private val patternSet: PatternSet = PatternSet() - .include(SERVICES_PATTERN) - .exclude(PATH_LEGACY_GROOVY_EXTENSION_MODULE_DESCRIPTOR), -) : ResourceTransformer, - PatternFilterable by patternSet { +public open class ServiceFileTransformer : + PatternFilterableResourceTransformer( + patternSet = PatternSet() + .include(SERVICES_PATTERN) + .exclude(PATH_LEGACY_GROOVY_EXTENSION_MODULE_DESCRIPTOR), + ) { @get:Internal internal val serviceEntries = mutableMapOf>() @@ -63,12 +63,6 @@ public open class ServiceFileTransformer( } } - @Input // Trigger task executions after includes changed. - override fun getIncludes(): MutableSet = patternSet.includes - - @Input // Trigger task executions after excludes changed. - override fun getExcludes(): MutableSet = patternSet.excludes - private companion object { private const val SERVICES_PATH = "META-INF/services" private const val SERVICES_PATTERN = "$SERVICES_PATH/**" From 4fe3a66b7426db9f9a61b4acc04f4f77da28d4c9 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 15 Nov 2025 20:27:19 +0800 Subject: [PATCH 2/6] Update changelog --- docs/changes/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/changes/README.md b/docs/changes/README.md index a178c5b27..f7b8cba56 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -3,6 +3,10 @@ ## [Unreleased](https://github.com/GradleUp/shadow/compare/9.2.2...HEAD) - 2025-xx-xx +### Added + +- Add `PatternFilterableResourceTransformer` to simplify pattern based `ResourceTransformer`s. ([#1849](https://github.com/GradleUp/shadow/pull/1849)) + ### Changed - Change the group of `startShadowScripts` from `application` to `other`. ([#1797](https://github.com/GradleUp/shadow/pull/1797)) From 09c1a0261960cebe721b35f225f4c14c8785fd91 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 15 Nov 2025 20:37:08 +0800 Subject: [PATCH 3/6] Public `patternSet` --- api/shadow.api | 3 +-- docs/changes/README.md | 1 + .../transformers/PatternFilterableResourceTransformer.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/shadow.api b/api/shadow.api index 2b051ba73..6a2f30f71 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -386,15 +386,14 @@ public class com/github/jengelman/gradle/plugins/shadow/transformers/ManifestRes } public abstract class com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer, org/gradle/api/tasks/util/PatternFilterable { - public fun ()V public fun (Lorg/gradle/api/tasks/util/PatternSet;)V - public synthetic fun (Lorg/gradle/api/tasks/util/PatternSet;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun exclude (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun exclude (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun exclude (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun exclude ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun getExcludes ()Ljava/util/Set; public fun getIncludes ()Ljava/util/Set; + public final fun getPatternSet ()Lorg/gradle/api/tasks/util/PatternSet; public fun include (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun include (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun include (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; diff --git a/docs/changes/README.md b/docs/changes/README.md index f7b8cba56..099b558b3 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -6,6 +6,7 @@ ### Added - Add `PatternFilterableResourceTransformer` to simplify pattern based `ResourceTransformer`s. ([#1849](https://github.com/GradleUp/shadow/pull/1849)) +- Expose `patternSet` of `ServiceFileTransformer` as `public`. ([#1849](https://github.com/GradleUp/shadow/pull/1849)) ### Changed diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt index 992f05092..00e04ad2a 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt @@ -6,7 +6,7 @@ import org.gradle.api.tasks.util.PatternFilterable import org.gradle.api.tasks.util.PatternSet public abstract class PatternFilterableResourceTransformer( - @Internal internal val patternSet: PatternSet = PatternSet(), + @Internal public val patternSet: PatternSet, ) : ResourceTransformer, PatternFilterable by patternSet { From 9de70fb55a5c4bd65fa2c6986e595b03bcbc13ba Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 15 Nov 2025 20:51:29 +0800 Subject: [PATCH 4/6] Fix ctor of `ServiceFileTransformer` --- api/shadow.api | 2 ++ .../shadow/transformers/ServiceFileTransformer.kt | 11 +++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/api/shadow.api b/api/shadow.api index 6a2f30f71..445afa119 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -466,6 +466,8 @@ public final class com/github/jengelman/gradle/plugins/shadow/transformers/Resou public class com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer { public fun ()V + public fun (Lorg/gradle/api/tasks/util/PatternSet;)V + public synthetic fun (Lorg/gradle/api/tasks/util/PatternSet;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z public fun getPath ()Ljava/lang/String; public fun hasTransformedResource ()Z diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt index a01f007f4..8fee96186 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt @@ -24,12 +24,11 @@ import org.gradle.api.tasks.util.PatternSet * @author John Engelman */ @CacheableTransformer -public open class ServiceFileTransformer : - PatternFilterableResourceTransformer( - patternSet = PatternSet() - .include(SERVICES_PATTERN) - .exclude(PATH_LEGACY_GROOVY_EXTENSION_MODULE_DESCRIPTOR), - ) { +public open class ServiceFileTransformer( + patternSet: PatternSet = PatternSet() + .include(SERVICES_PATTERN) + .exclude(PATH_LEGACY_GROOVY_EXTENSION_MODULE_DESCRIPTOR), +) : PatternFilterableResourceTransformer(patternSet = patternSet) { @get:Internal internal val serviceEntries = mutableMapOf>() From c344e1603ee298218e8e4f845bcb208d6bcfdeeb Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 15 Nov 2025 21:36:16 +0800 Subject: [PATCH 5/6] Override `canTransformResource` --- api/shadow.api | 7 ++++++- .../transformers/PatternFilterableResourceTransformer.kt | 7 ++++++- .../plugins/shadow/transformers/ServiceFileTransformer.kt | 7 ------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/api/shadow.api b/api/shadow.api index 445afa119..81644f95e 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -387,19 +387,25 @@ public class com/github/jengelman/gradle/plugins/shadow/transformers/ManifestRes public abstract class com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer, org/gradle/api/tasks/util/PatternFilterable { public fun (Lorg/gradle/api/tasks/util/PatternSet;)V + public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z public fun exclude (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun exclude (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun exclude (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun exclude ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun getExcludes ()Ljava/util/Set; public fun getIncludes ()Ljava/util/Set; + public fun getName ()Ljava/lang/String; + public fun getObjectFactory ()Lorg/gradle/api/model/ObjectFactory; public final fun getPatternSet ()Lorg/gradle/api/tasks/util/PatternSet; + public fun hasTransformedResource ()Z public fun include (Lgroovy/lang/Closure;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun include (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun include (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun include ([Ljava/lang/String;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun modifyOutputStream (Lorg/apache/tools/zip/ZipOutputStream;Z)V public fun setExcludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; public fun setIncludes (Ljava/lang/Iterable;)Lorg/gradle/api/tasks/util/PatternFilterable; + public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V } public class com/github/jengelman/gradle/plugins/shadow/transformers/PreserveFirstFoundResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer { @@ -468,7 +474,6 @@ public class com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFile public fun ()V public fun (Lorg/gradle/api/tasks/util/PatternSet;)V public synthetic fun (Lorg/gradle/api/tasks/util/PatternSet;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z public fun getPath ()Ljava/lang/String; public fun hasTransformedResource ()Z public fun modifyOutputStream (Lorg/apache/tools/zip/ZipOutputStream;Z)V diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt index 00e04ad2a..dd1905702 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt @@ -1,5 +1,6 @@ package com.github.jengelman.gradle.plugins.shadow.transformers +import org.gradle.api.file.FileTreeElement import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.util.PatternFilterable @@ -7,9 +8,13 @@ import org.gradle.api.tasks.util.PatternSet public abstract class PatternFilterableResourceTransformer( @Internal public val patternSet: PatternSet, -) : ResourceTransformer, +) : ResourceTransformer by ResourceTransformer.Companion, PatternFilterable by patternSet { + override fun canTransformResource(element: FileTreeElement): Boolean { + return patternSet.asSpec.isSatisfiedBy(element) + } + @Input // Trigger task executions after includes changed. override fun getIncludes(): MutableSet = patternSet.includes diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt index 8fee96186..3b56e2a7d 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt @@ -4,10 +4,7 @@ import com.github.jengelman.gradle.plugins.shadow.internal.zipEntry import com.github.jengelman.gradle.plugins.shadow.relocation.relocateClass import com.github.jengelman.gradle.plugins.shadow.transformers.GroovyExtensionModuleTransformer.Companion.PATH_LEGACY_GROOVY_EXTENSION_MODULE_DESCRIPTOR import org.apache.tools.zip.ZipOutputStream -import org.gradle.api.file.FileTreeElement -import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.util.PatternFilterable import org.gradle.api.tasks.util.PatternSet /** @@ -39,10 +36,6 @@ public open class ServiceFileTransformer( patternSet.setIncludes(listOf("$value/**")) } - override fun canTransformResource(element: FileTreeElement): Boolean { - return patternSet.asSpec.isSatisfiedBy(element) - } - override fun transform(context: TransformerContext) { val resource = path + "/" + context.relocators.relocateClass(context.path.substringAfter("$path/")) From 2606a48ac882952fca1badebdc3312a61e64f31c Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 15 Nov 2025 21:43:14 +0800 Subject: [PATCH 6/6] Add Kdoc --- .../transformers/PatternFilterableResourceTransformer.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt index dd1905702..466b69996 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer.kt @@ -6,6 +6,11 @@ import org.gradle.api.tasks.Internal import org.gradle.api.tasks.util.PatternFilterable import org.gradle.api.tasks.util.PatternSet +/** + * A base class for resource transformers that support pattern filtering. + * + * @param patternSet The [PatternSet] used for filtering resources. + */ public abstract class PatternFilterableResourceTransformer( @Internal public val patternSet: PatternSet, ) : ResourceTransformer by ResourceTransformer.Companion,