diff --git a/api/shadow.api b/api/shadow.api index 6712ce3fc..ed46f45a4 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -266,6 +266,7 @@ public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNotic public final fun getObjectFactory ()Lorg/gradle/api/model/ObjectFactory; public fun getOrganizationName ()Lorg/gradle/api/provider/Property; public fun getOrganizationURL ()Lorg/gradle/api/provider/Property; + public fun getOutputPath ()Lorg/gradle/api/provider/Property; public fun getPreamble1 ()Lorg/gradle/api/provider/Property; public fun getPreamble2 ()Lorg/gradle/api/provider/Property; public fun getPreamble3 ()Lorg/gradle/api/provider/Property; diff --git a/docs/changes/README.md b/docs/changes/README.md index e7fc721fe..487920713 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -9,6 +9,7 @@ - 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)) +- Support overriding output path of `ApacheNoticeResourceTransformer`. ([#1851](https://github.com/GradleUp/shadow/pull/1851)) ### Changed diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformersTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformersTest.kt index 69bb88224..cba2f7ebb 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformersTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformersTest.kt @@ -251,6 +251,45 @@ class TransformersTest : BaseTransformerTest() { } } + @Test + fun overrideOutputPathOfNoticeFile() { + val noticeEntry = "META-INF/NOTICE" + val customNoticeEntry = "META-INF/CUSTOM_NOTICE" + val one = buildJarOne { + insert(noticeEntry, "Notice from A") + } + val two = buildJarTwo { + insert(noticeEntry, "Notice from B") + } + projectScript.appendText( + transform( + dependenciesBlock = implementationFiles(one, two), + transformerBlock = "addHeader = false; outputPath = '$customNoticeEntry'", + ), + ) + + runWithSuccess(shadowJarPath) + + assertThat(outputShadowedJar).useAll { + containsOnly( + customNoticeEntry, + *manifestEntries, + ) + getContent(customNoticeEntry).isEqualTo( + """ + Copyright 2006-2025 The Apache Software Foundation + + This product includes software developed at + The Apache Software Foundation (https://www.apache.org/). + + Notice from A + + Notice from B + """.trimIndent(), + ) + } + } + @ParameterizedTest @MethodSource("transformerConfigProvider") fun otherTransformers(pair: Pair>) { 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 b142ff271..95e04b0e0 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 @@ -76,6 +76,14 @@ public open class ApacheNoticeResourceTransformer( @get:Input public open val charsetName: Property = objectFactory.property(Charsets.UTF_8.name()) + /** + * The output path of the `NOTICE` file. + * + * Defaults to `META-INF/NOTICE`. + */ + @get:Input + public open val outputPath: Property = objectFactory.property(NOTICE_PATH) + @Inject public constructor(objectFactory: ObjectFactory) : this( objectFactory, @@ -190,7 +198,7 @@ public open class ApacheNoticeResourceTransformer( } } - os.putNextEntry(zipEntry(NOTICE_PATH, preserveFileTimestamps)) + os.putNextEntry(zipEntry(outputPath.get(), preserveFileTimestamps)) os.write(sb.toString().trim().toByteArray(charset)) os.closeEntry()