diff --git a/api/shadow.api b/api/shadow.api index 81644f95e..6712ce3fc 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -250,19 +250,15 @@ 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 { +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/docs/changes/README.md b/docs/changes/README.md index 099b558b3..e7fc721fe 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -7,6 +7,8 @@ - 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 diff --git a/docs/configuration/merging/README.md b/docs/configuration/merging/README.md index 0eea6f3f8..43ca7f27c 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.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 +[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) 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..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 @@ -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,14 +10,15 @@ 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) - } - +public open class ApacheLicenseResourceTransformer @JvmOverloads constructor( + patternSet: PatternSet = PatternSet() + .apply { isCaseSensitive = false } + .include( + LICENSE_PATH, + LICENSE_TXT_PATH, + LICENSE_MD_PATH, + ), +) : PatternFilterableResourceTransformer(patternSet = patternSet) { private companion object { private const val LICENSE_PATH = "META-INF/LICENSE" private const val LICENSE_TXT_PATH = "META-INF/LICENSE.txt" 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() 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), 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