From 530750321e53cb5128e69b5d55d23ebb041129da Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 15 Nov 2025 21:12:35 +0800 Subject: [PATCH 1/9] Expose `patternSet` of `ApacheLicenseResourceTransformer` as `public` --- api/shadow.api | 10 +++----- docs/changes/README.md | 1 + .../ApacheLicenseResourceTransformer.kt | 25 ++++++++----------- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/api/shadow.api b/api/shadow.api index 81644f95e..b0516b18b 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -250,14 +250,10 @@ public final class com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar$Co public final synthetic fun getShadowJar (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider; } -public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer { +public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer { public fun ()V - public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z - public fun getName ()Ljava/lang/String; - public fun getObjectFactory ()Lorg/gradle/api/model/ObjectFactory; - public fun hasTransformedResource ()Z - public fun modifyOutputStream (Lorg/apache/tools/zip/ZipOutputStream;Z)V - public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)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 class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer { diff --git a/docs/changes/README.md b/docs/changes/README.md index 099b558b3..da0662315 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -7,6 +7,7 @@ - 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)) +- Expose `patternSet` of `ApacheLicenseResourceTransformer` as `public`. ([#1850](https://github.com/GradleUp/shadow/pull/1850)) ### Changed diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt index 71f29c862..162811a82 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt @@ -1,6 +1,6 @@ package com.github.jengelman.gradle.plugins.shadow.transformers -import org.gradle.api.file.FileTreeElement +import org.gradle.api.tasks.util.PatternSet /** * Prevents duplicate copies of the license. @@ -10,17 +10,12 @@ import org.gradle.api.file.FileTreeElement * @author John Engelman */ @CacheableTransformer -public open class ApacheLicenseResourceTransformer : ResourceTransformer by ResourceTransformer.Companion { - override fun canTransformResource(element: FileTreeElement): Boolean { - val path = element.path - return LICENSE_PATH.equals(path, ignoreCase = true) || - LICENSE_TXT_PATH.regionMatches(0, path, 0, LICENSE_TXT_PATH.length, ignoreCase = true) || - LICENSE_MD_PATH.regionMatches(0, path, 0, LICENSE_MD_PATH.length, ignoreCase = true) - } - - private companion object { - private const val LICENSE_PATH = "META-INF/LICENSE" - private const val LICENSE_TXT_PATH = "META-INF/LICENSE.txt" - private const val LICENSE_MD_PATH = "META-INF/LICENSE.md" - } -} +public open class ApacheLicenseResourceTransformer( + patternSet: PatternSet = PatternSet() + .apply { isCaseSensitive = false } + .include( + "META-INF/LICENSE", + "META-INF/LICENSE.txt", + "META-INF/LICENSE.md", + ), +) : PatternFilterableResourceTransformer(patternSet = patternSet) From 64efb6b8e2def5a80e1d170b2ae6dd2fba1c233a Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 16 Nov 2025 10:01:46 +0800 Subject: [PATCH 2/9] Mark `JvmOverloads` for ctors --- .../shadow/transformers/ApacheLicenseResourceTransformer.kt | 2 +- .../plugins/shadow/transformers/ServiceFileTransformer.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt index 162811a82..4f90f8302 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt @@ -10,7 +10,7 @@ import org.gradle.api.tasks.util.PatternSet * @author John Engelman */ @CacheableTransformer -public open class ApacheLicenseResourceTransformer( +public open class ApacheLicenseResourceTransformer @JvmOverloads constructor( patternSet: PatternSet = PatternSet() .apply { isCaseSensitive = false } .include( 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 3b56e2a7d..88bf1ce5f 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 @@ -21,7 +21,7 @@ import org.gradle.api.tasks.util.PatternSet * @author John Engelman */ @CacheableTransformer -public open class ServiceFileTransformer( +public open class ServiceFileTransformer @JvmOverloads constructor( patternSet: PatternSet = PatternSet() .include(SERVICES_PATTERN) .exclude(PATH_LEGACY_GROOVY_EXTENSION_MODULE_DESCRIPTOR), From 8e169d428decca3c4a15e1676e117442ed4e54e8 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 16 Nov 2025 10:18:50 +0800 Subject: [PATCH 3/9] Expose `patternSet` of `ApacheNoticeResourceTransformer` as `public` --- api/shadow.api | 4 ++-- .../ApacheNoticeResourceTransformer.kt | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/api/shadow.api b/api/shadow.api index b0516b18b..6712ce3fc 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -256,9 +256,9 @@ public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicen public synthetic fun (Lorg/gradle/api/tasks/util/PatternSet;ILkotlin/jvm/internal/DefaultConstructorMarker;)V } -public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer { +public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer { public fun (Lorg/gradle/api/model/ObjectFactory;)V - public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z + public fun (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/tasks/util/PatternSet;)V public fun getAddHeader ()Lorg/gradle/api/provider/Property; public fun getCharsetName ()Lorg/gradle/api/provider/Property; public fun getCopyright ()Lorg/gradle/api/provider/Property; diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer.kt index 40109113a..b142ff271 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer.kt @@ -9,10 +9,10 @@ import java.util.Locale import java.util.TreeSet import javax.inject.Inject import org.apache.tools.zip.ZipOutputStream -import org.gradle.api.file.FileTreeElement import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.tasks.Input +import org.gradle.api.tasks.util.PatternSet /** * Merges `META-INF/NOTICE.TXT` files. @@ -22,9 +22,10 @@ import org.gradle.api.tasks.Input * @author John Engelman */ @CacheableTransformer -public open class ApacheNoticeResourceTransformer @Inject constructor( +public open class ApacheNoticeResourceTransformer( final override val objectFactory: ObjectFactory, -) : ResourceTransformer { + patternSet: PatternSet, +) : PatternFilterableResourceTransformer(patternSet) { private val entries = mutableSetOf() private val organizationEntries = mutableMapOf>() private inline val charset get() = Charset.forName(charsetName.get()) @@ -75,12 +76,17 @@ public open class ApacheNoticeResourceTransformer @Inject constructor( @get:Input public open val charsetName: Property = objectFactory.property(Charsets.UTF_8.name()) - override fun canTransformResource(element: FileTreeElement): Boolean { - val path = element.path - return NOTICE_PATH.equals(path, ignoreCase = true) || - NOTICE_TXT_PATH.equals(path, ignoreCase = true) || - NOTICE_MD_PATH.equals(path, ignoreCase = true) - } + @Inject + public constructor(objectFactory: ObjectFactory) : this( + objectFactory, + patternSet = PatternSet() + .apply { isCaseSensitive = false } + .include( + NOTICE_PATH, + NOTICE_TXT_PATH, + NOTICE_MD_PATH, + ), + ) override fun transform(context: TransformerContext) { val projectName = projectName.get() From d709dd781a6a7c38a89da156ab6cbce01f7aea20 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 16 Nov 2025 10:22:51 +0800 Subject: [PATCH 4/9] Restore props back --- .../ApacheLicenseResourceTransformer.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt index 4f90f8302..f28ec92b3 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt @@ -14,8 +14,14 @@ public open class ApacheLicenseResourceTransformer @JvmOverloads constructor( patternSet: PatternSet = PatternSet() .apply { isCaseSensitive = false } .include( - "META-INF/LICENSE", - "META-INF/LICENSE.txt", - "META-INF/LICENSE.md", + LICENSE_PATH, + LICENSE_TXT_PATH, + LICENSE_MD_PATH, ), -) : PatternFilterableResourceTransformer(patternSet = patternSet) +) : PatternFilterableResourceTransformer(patternSet = patternSet) { + private companion object { + private const val LICENSE_PATH = "META-INF/LICENSE" + private const val LICENSE_TXT_PATH = "META-INF/LICENSE.txt" + private const val LICENSE_MD_PATH = "META-INF/LICENSE.md" + } +} From fde1e3d51642be89125a34352507f10c257ef1c7 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 16 Nov 2025 10:38:07 +0800 Subject: [PATCH 5/9] Test `canTransformByPattern` --- .../ApacheLicenseResourceTransformerTest.kt | 10 ++++++++++ .../ApacheNoticeResourceTransformerTest.kt | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt index 556e9c6bc..fc27f7fc8 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt @@ -23,4 +23,14 @@ class ApacheLicenseResourceTransformerTest : BaseTransformerTest Date: Mon, 17 Nov 2025 16:50:11 +0800 Subject: [PATCH 6/9] Document `Configuring Resource Transformer Filtering by Pattern` --- docs/configuration/merging/README.md | 39 ++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/docs/configuration/merging/README.md b/docs/configuration/merging/README.md index 0eea6f3f8..94651e228 100644 --- a/docs/configuration/merging/README.md +++ b/docs/configuration/merging/README.md @@ -546,6 +546,41 @@ It must be added using the [`transform`][ShadowJar.transform] methods. } ``` +## Configuring Resource Transformer Filtering by Pattern + +There are lots of built-in [`ResourceTransformer`][ResourceTransformer]s provided by Shadow. Some of them extend +[`PatternFilterableResourceTransformer`][PatternFilterableResourceTransformer], which extends +[`PatternFilterable`][PatternFilterable] to provide `include`/`exclude` pattern filtering capabilities. e.g. + +- [`ApacheLicenseResourceTransformer`][ApacheLicenseResourceTransformer] +- [`ApacheNoticeResourceTransformer`][ApacheNoticeResourceTransformer] +- [`ServiceFileTransformer`][ServiceFileTransformer] +- ... + +You can use `include`/`exclude` and more methods to configure the patterns for those +[`ResourceTransformer`][ResourceTransformer]s that support it. For example: + +=== "Kotlin" + + ```kotlin + tasks.shadowJar { + transform() { + include("META-INF/LICENSE.*") + exclude("META-INF/LICENSE.log") + } + } + ``` + +=== "Groovy" + + ```groovy + tasks.named('shadowJar', com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) { + transform(com.github.jengelman.gradle.plugins.shadow.transformers.ApacheLicenseResourceTransformer) { + include 'META-INF/LICENSE.*' + exclude 'META-INF/LICENSE.log' + } + } + [AbstractCopyTask]: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.AbstractCopyTask.html @@ -558,8 +593,12 @@ It must be added using the [`transform`][ShadowJar.transform] methods. [Jar]: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html [Log4j2PluginsCacheFileTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-log4j2-plugins-cache-file-transformer/index.html [ResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-resource-transformer/index.html +[ApacheLicenseResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-apache-license-resource-transformer/index.html +[ApacheNoticeResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transform/-apache-notice-resource-transformer/index.html [ServiceFileTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-service-file-transformer/index.html [PreserveFirstFoundResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-preserve-first-found-resource-transformer/index.html +[PatternFilterable]: https://docs.gradle.org/current/kotlin-dsl/gradle/org.gradle.api.tasks.util/-pattern-filterable/index.html +[PatternFilterableResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-pattern-filterable-resource-transformer/index.html [ShadowJar.append]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.tasks/-shadow-jar/append.html [ShadowJar.failOnDuplicateEntries]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.tasks/-shadow-jar/fail-on-duplicate-entries.html [ShadowJar.from]: https://docs.gradle.org/current/dsl/org.gradle.jvm.tasks.Jar.html#org.gradle.jvm.tasks.Jar:from(java.lang.Object,%20org.gradle.api.Action) From 41705c4f45b922899e27618093ca6f9e37d00367 Mon Sep 17 00:00:00 2001 From: Zongle Wang Date: Mon, 17 Nov 2025 16:54:45 +0800 Subject: [PATCH 7/9] Update docs/configuration/merging/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/configuration/merging/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/merging/README.md b/docs/configuration/merging/README.md index 94651e228..9b167ae9a 100644 --- a/docs/configuration/merging/README.md +++ b/docs/configuration/merging/README.md @@ -594,7 +594,7 @@ You can use `include`/`exclude` and more methods to configure the patterns for t [Log4j2PluginsCacheFileTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-log4j2-plugins-cache-file-transformer/index.html [ResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-resource-transformer/index.html [ApacheLicenseResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-apache-license-resource-transformer/index.html -[ApacheNoticeResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transform/-apache-notice-resource-transformer/index.html +[ApacheNoticeResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-apache-notice-resource-transformer/index.html [ServiceFileTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-service-file-transformer/index.html [PreserveFirstFoundResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-preserve-first-found-resource-transformer/index.html [PatternFilterable]: https://docs.gradle.org/current/kotlin-dsl/gradle/org.gradle.api.tasks.util/-pattern-filterable/index.html From 73524448a652ed965dfc2164649827463b17f272 Mon Sep 17 00:00:00 2001 From: Zongle Wang Date: Mon, 17 Nov 2025 16:54:55 +0800 Subject: [PATCH 8/9] Update docs/changes/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/changes/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changes/README.md b/docs/changes/README.md index da0662315..e7fc721fe 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -8,6 +8,7 @@ - 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)) - Expose `patternSet` of `ApacheLicenseResourceTransformer` as `public`. ([#1850](https://github.com/GradleUp/shadow/pull/1850)) +- Expose `patternSet` of `ApacheNoticeResourceTransformer` as `public`. ([#1850](https://github.com/GradleUp/shadow/pull/1850)) ### Changed From 95b27a88c67c4c11b87a068f960e43bc64734b59 Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 17 Nov 2025 16:52:47 +0800 Subject: [PATCH 9/9] Fix doc --- docs/configuration/merging/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/merging/README.md b/docs/configuration/merging/README.md index 9b167ae9a..43ca7f27c 100644 --- a/docs/configuration/merging/README.md +++ b/docs/configuration/merging/README.md @@ -580,7 +580,7 @@ You can use `include`/`exclude` and more methods to configure the patterns for t exclude 'META-INF/LICENSE.log' } } - + ``` [AbstractCopyTask]: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.AbstractCopyTask.html