From 5606962cf80ea7dc34ec43670e1d41a00b0d937a Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 2 Sep 2025 15:49:40 +0800 Subject: [PATCH 1/7] New `CompositeRelocator` --- .../shadow/internal/CompositeRelocator.kt | 39 +++++++++++++++++++ .../plugins/shadow/tasks/ShadowCopyAction.kt | 11 ++++-- 2 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt new file mode 100644 index 000000000..7dbdccd7b --- /dev/null +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt @@ -0,0 +1,39 @@ +package com.github.jengelman.gradle.plugins.shadow.internal + +import com.github.jengelman.gradle.plugins.shadow.relocation.RelocateClassContext +import com.github.jengelman.gradle.plugins.shadow.relocation.RelocatePathContext +import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator +import com.github.jengelman.gradle.plugins.shadow.relocation.relocateClass +import com.github.jengelman.gradle.plugins.shadow.relocation.relocatePath + +internal class CompositeRelocator( + private val relocators: Set, +) : Relocator { + override fun relocatePath(context: RelocatePathContext): String { + var relocated = context.path + for (relocator in relocators) { + if (relocator.canRelocatePath(relocated)) { + relocated = relocator.relocatePath(relocated) + } + } + return relocated + } + + override fun relocateClass(context: RelocateClassContext): String { + var relocated = context.className + for (relocator in relocators) { + if (relocator.canRelocateClass(relocated)) { + relocated = relocator.relocateClass(relocated) + } + } + return relocated + } + + override fun canRelocateClass(className: String): Boolean = notImplemented() + + override fun canRelocatePath(path: String): Boolean = notImplemented() + + override fun applyToSourceContent(sourceContent: String): String = notImplemented() + + private fun notImplemented(): Nothing = error("We don't have to implement this... yet") +} diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt index d28a37fc3..163b8501c 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt @@ -1,9 +1,11 @@ package com.github.jengelman.gradle.plugins.shadow.tasks +import com.github.jengelman.gradle.plugins.shadow.internal.CompositeRelocator import com.github.jengelman.gradle.plugins.shadow.internal.RelocatorRemapper import com.github.jengelman.gradle.plugins.shadow.internal.cast import com.github.jengelman.gradle.plugins.shadow.internal.zipEntry import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator +import com.github.jengelman.gradle.plugins.shadow.relocation.relocatePath import com.github.jengelman.gradle.plugins.shadow.transformers.ResourceTransformer import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext import java.io.File @@ -39,6 +41,7 @@ public open class ShadowCopyAction( private val failOnDuplicateEntries: Boolean, private val encoding: String?, ) : CopyAction { + private val compositeRelocator = CompositeRelocator(relocators) private val visitedDirs = mutableMapOf() override fun execute(stream: CopyActionProcessingStream): WorkResult { @@ -166,7 +169,7 @@ public open class ShadowCopyAction( } } else -> { - val mapped = RelocatorRemapper(relocators).map(path) + val mapped = compositeRelocator.relocatePath(path) if (transform(fileDetails, mapped)) return fileDetails.writeToZip(mapped) } @@ -215,9 +218,9 @@ public open class ShadowCopyAction( // Temporarily remove the multi-release prefix. val multiReleasePrefix = "^META-INF/versions/\\d+/".toRegex().find(path)?.value.orEmpty() val newPath = path.replace(multiReleasePrefix, "") - val mappedName = multiReleasePrefix + remapper.mapPath(newPath) + val relocatedName = multiReleasePrefix + compositeRelocator.relocatePath(newPath) try { - val entry = zipEntry("$mappedName.class", preserveFileTimestamps, lastModified) { + val entry = zipEntry(relocatedName, preserveFileTimestamps, lastModified) { unixMode = UnixStat.FILE_FLAG or permissions.toUnixNumeric() } // Now we put it back on so the class file is written out with the right extension. @@ -225,7 +228,7 @@ public open class ShadowCopyAction( zipOutStr.write(newBytes) zipOutStr.closeEntry() } catch (_: ZipException) { - logger.warn("We have a duplicate $mappedName in source project") + logger.warn("We have a duplicate $relocatedName in source project") } } From 957dd3d6f3e331c4ae945cdb2adb6d0092020613 Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 2 Sep 2025 16:03:00 +0800 Subject: [PATCH 2/7] Remove `RelocatorRemapper.mapPath` --- .../gradle/plugins/shadow/internal/RelocatorRemapper.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt index 95f850bc9..61f824852 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt @@ -28,11 +28,6 @@ internal class RelocatorRemapper( override fun map(internalName: String): String = mapName(internalName) - fun mapPath(path: String): String { - val dotIndex = path.indexOf('.') - return if (dotIndex == -1) path else map(path.take(dotIndex)) - } - private fun mapName(name: String, mapLiterals: Boolean = false): String { val newName = mapNameImpl(name, mapLiterals) if (newName != name) { From 602fc3ff4f191d60c182db95d161cb6fcb7b28da Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 2 Sep 2025 16:10:17 +0800 Subject: [PATCH 3/7] Cleanups --- .../shadow/internal/CompositeRelocator.kt | 23 ++++--------------- .../plugins/shadow/tasks/ShadowCopyAction.kt | 16 ++++++------- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt index 7dbdccd7b..f8f3e9501 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt @@ -3,37 +3,24 @@ package com.github.jengelman.gradle.plugins.shadow.internal import com.github.jengelman.gradle.plugins.shadow.relocation.RelocateClassContext import com.github.jengelman.gradle.plugins.shadow.relocation.RelocatePathContext import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator -import com.github.jengelman.gradle.plugins.shadow.relocation.relocateClass import com.github.jengelman.gradle.plugins.shadow.relocation.relocatePath internal class CompositeRelocator( private val relocators: Set, ) : Relocator { override fun relocatePath(context: RelocatePathContext): String { - var relocated = context.path + val path = context.path for (relocator in relocators) { - if (relocator.canRelocatePath(relocated)) { - relocated = relocator.relocatePath(relocated) + if (relocator.canRelocatePath(path)) { + return relocator.relocatePath(path) } } - return relocated - } - - override fun relocateClass(context: RelocateClassContext): String { - var relocated = context.className - for (relocator in relocators) { - if (relocator.canRelocateClass(relocated)) { - relocated = relocator.relocateClass(relocated) - } - } - return relocated + return path } + override fun relocateClass(context: RelocateClassContext): String = notImplemented() override fun canRelocateClass(className: String): Boolean = notImplemented() - override fun canRelocatePath(path: String): Boolean = notImplemented() - override fun applyToSourceContent(sourceContent: String): String = notImplemented() - private fun notImplemented(): Nothing = error("We don't have to implement this... yet") } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt index 163b8501c..9a4c99976 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt @@ -169,9 +169,9 @@ public open class ShadowCopyAction( } } else -> { - val mapped = compositeRelocator.relocatePath(path) - if (transform(fileDetails, mapped)) return - fileDetails.writeToZip(mapped) + val relocated = compositeRelocator.relocatePath(path) + if (transform(fileDetails, relocated)) return + fileDetails.writeToZip(relocated) } } } @@ -218,9 +218,9 @@ public open class ShadowCopyAction( // Temporarily remove the multi-release prefix. val multiReleasePrefix = "^META-INF/versions/\\d+/".toRegex().find(path)?.value.orEmpty() val newPath = path.replace(multiReleasePrefix, "") - val relocatedName = multiReleasePrefix + compositeRelocator.relocatePath(newPath) + val relocatedPath = multiReleasePrefix + compositeRelocator.relocatePath(newPath) try { - val entry = zipEntry(relocatedName, preserveFileTimestamps, lastModified) { + val entry = zipEntry(relocatedPath, preserveFileTimestamps, lastModified) { unixMode = UnixStat.FILE_FLAG or permissions.toUnixNumeric() } // Now we put it back on so the class file is written out with the right extension. @@ -228,16 +228,16 @@ public open class ShadowCopyAction( zipOutStr.write(newBytes) zipOutStr.closeEntry() } catch (_: ZipException) { - logger.warn("We have a duplicate $relocatedName in source project") + logger.warn("We have a duplicate $relocatedPath in source project") } } - private fun transform(fileDetails: FileCopyDetails, mapped: String): Boolean { + private fun transform(fileDetails: FileCopyDetails, path: String): Boolean { val transformer = transformers.find { it.canTransformResource(fileDetails) } ?: return false fileDetails.file.inputStream().use { inputStream -> transformer.transform( TransformerContext( - path = mapped, + path = path, inputStream = inputStream, relocators = relocators, ), From a37f8ba926f36e0cc2d4dcfbf1b8fa58322efa65 Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 2 Sep 2025 17:02:21 +0800 Subject: [PATCH 4/7] Replace `CompositeRelocator` with `relocatePath` extension --- .../shadow/internal/CompositeRelocator.kt | 26 ------------------- .../shadow/relocation/RelocationContext.kt | 9 +++++++ .../plugins/shadow/tasks/ShadowCopyAction.kt | 6 ++--- 3 files changed, 11 insertions(+), 30 deletions(-) delete mode 100644 src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt deleted file mode 100644 index f8f3e9501..000000000 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CompositeRelocator.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.jengelman.gradle.plugins.shadow.internal - -import com.github.jengelman.gradle.plugins.shadow.relocation.RelocateClassContext -import com.github.jengelman.gradle.plugins.shadow.relocation.RelocatePathContext -import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator -import com.github.jengelman.gradle.plugins.shadow.relocation.relocatePath - -internal class CompositeRelocator( - private val relocators: Set, -) : Relocator { - override fun relocatePath(context: RelocatePathContext): String { - val path = context.path - for (relocator in relocators) { - if (relocator.canRelocatePath(path)) { - return relocator.relocatePath(path) - } - } - return path - } - - override fun relocateClass(context: RelocateClassContext): String = notImplemented() - override fun canRelocateClass(className: String): Boolean = notImplemented() - override fun canRelocatePath(path: String): Boolean = notImplemented() - override fun applyToSourceContent(sourceContent: String): String = notImplemented() - private fun notImplemented(): Nothing = error("We don't have to implement this... yet") -} diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt index b3c5c628a..78c587586 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt @@ -15,3 +15,12 @@ public fun Relocator.relocateClass(className: String): String { public fun Relocator.relocatePath(path: String): String { return relocatePath(RelocatePathContext(path)) } + +public fun Iterable.relocatePath(path: String): String { + forEach { relocator -> + if (relocator.canRelocatePath(path)) { + return relocator.relocatePath(path) + } + } + return path +} diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt index 9a4c99976..5587f1df3 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt @@ -1,6 +1,5 @@ package com.github.jengelman.gradle.plugins.shadow.tasks -import com.github.jengelman.gradle.plugins.shadow.internal.CompositeRelocator import com.github.jengelman.gradle.plugins.shadow.internal.RelocatorRemapper import com.github.jengelman.gradle.plugins.shadow.internal.cast import com.github.jengelman.gradle.plugins.shadow.internal.zipEntry @@ -41,7 +40,6 @@ public open class ShadowCopyAction( private val failOnDuplicateEntries: Boolean, private val encoding: String?, ) : CopyAction { - private val compositeRelocator = CompositeRelocator(relocators) private val visitedDirs = mutableMapOf() override fun execute(stream: CopyActionProcessingStream): WorkResult { @@ -169,7 +167,7 @@ public open class ShadowCopyAction( } } else -> { - val relocated = compositeRelocator.relocatePath(path) + val relocated = relocators.relocatePath(path) if (transform(fileDetails, relocated)) return fileDetails.writeToZip(relocated) } @@ -218,7 +216,7 @@ public open class ShadowCopyAction( // Temporarily remove the multi-release prefix. val multiReleasePrefix = "^META-INF/versions/\\d+/".toRegex().find(path)?.value.orEmpty() val newPath = path.replace(multiReleasePrefix, "") - val relocatedPath = multiReleasePrefix + compositeRelocator.relocatePath(newPath) + val relocatedPath = multiReleasePrefix + relocators.relocatePath(newPath) try { val entry = zipEntry(relocatedPath, preserveFileTimestamps, lastModified) { unixMode = UnixStat.FILE_FLAG or permissions.toUnixNumeric() From fc013106ec2047e9944e3570a26d70c7422be7ef Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 2 Sep 2025 17:14:27 +0800 Subject: [PATCH 5/7] Add `relocateClass` extension --- api/shadow.api | 2 ++ .../shadow/relocation/RelocationContext.kt | 9 ++++++++ .../ComponentsXmlResourceTransformer.kt | 9 +------- .../Log4j2PluginsCacheFileTransformer.kt | 6 +----- .../transformers/ServiceFileTransformer.kt | 21 ++++--------------- 5 files changed, 17 insertions(+), 30 deletions(-) diff --git a/api/shadow.api b/api/shadow.api index cf28c3d2c..c983f9eaf 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -106,7 +106,9 @@ public final class com/github/jengelman/gradle/plugins/shadow/relocation/Relocat public final class com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContextKt { public static final fun relocateClass (Lcom/github/jengelman/gradle/plugins/shadow/relocation/Relocator;Ljava/lang/String;)Ljava/lang/String; + public static final fun relocateClass (Ljava/lang/Iterable;Ljava/lang/String;)Ljava/lang/String; public static final fun relocatePath (Lcom/github/jengelman/gradle/plugins/shadow/relocation/Relocator;Ljava/lang/String;)Ljava/lang/String; + public static final fun relocatePath (Ljava/lang/Iterable;Ljava/lang/String;)Ljava/lang/String; } public abstract interface class com/github/jengelman/gradle/plugins/shadow/relocation/Relocator { diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt index 78c587586..00fcc90ac 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocationContext.kt @@ -16,6 +16,15 @@ public fun Relocator.relocatePath(path: String): String { return relocatePath(RelocatePathContext(path)) } +public fun Iterable.relocateClass(className: String): String { + forEach { relocator -> + if (relocator.canRelocateClass(className)) { + return relocator.relocateClass(className) + } + } + return className +} + public fun Iterable.relocatePath(path: String): String { forEach { relocator -> if (relocator.canRelocatePath(path)) { diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt index 9a4b731d3..c1242154c 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt @@ -106,14 +106,7 @@ public open class ComponentsXmlResourceTransformer : ResourceTransformer { public const val COMPONENTS_XML_PATH: String = "META-INF/plexus/components.xml" private fun getRelocatedClass(className: String?, context: TransformerContext): String? { - if (!className.isNullOrEmpty()) { - for (relocator in context.relocators) { - if (relocator.canRelocateClass(className)) { - return relocator.relocateClass(className) - } - } - } - return className + return className?.let { context.relocators.relocateClass(it) } } private fun getValue(dom: Xpp3Dom, element: String): String { diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformer.kt index 551ffd7a9..e3ec52983 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformer.kt @@ -67,11 +67,7 @@ public open class Log4j2PluginsCacheFileTransformer : ResourceTransformer { internal fun relocatePlugins(pluginCache: PluginCache) { pluginCache.allCategories.values.forEach { currentMap -> currentMap.values.forEach { currentPluginEntry -> - val className = currentPluginEntry.className - tempRelocators.firstOrNull { it.canRelocateClass(className) }?.let { relocator -> - // Then we perform that relocation and update the plugin entry to reflect the new value. - currentPluginEntry.className = relocator.relocateClass(className) - } + currentPluginEntry.className = tempRelocators.relocateClass(currentPluginEntry.className) } } } 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 dbd7627e6..87e888583 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 @@ -45,24 +45,11 @@ public open class ServiceFileTransformer( } override fun transform(context: TransformerContext) { - var resource = context.path.substringAfter("$path/") - context.relocators.forEach { relocator -> - if (relocator.canRelocateClass(resource)) { - resource = relocator.relocateClass(resource) - return@forEach - } - } - resource = "$path/$resource" + val resource = path + "/" + + context.relocators.relocateClass(context.path.substringAfter("$path/")) val out = serviceEntries.getOrPut(resource) { mutableSetOf() } - - context.inputStream.bufferedReader().use { it.readLines() }.forEach { - var line = it - context.relocators.forEach { relocator -> - if (relocator.canRelocateClass(line)) { - line = relocator.relocateClass(line) - } - } - out.add(line) + context.inputStream.bufferedReader().use { it.readLines() }.forEach { line -> + out.add(context.relocators.relocateClass(line)) } } From aca3943fe0206a46015529b16484062f910d7220 Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 2 Sep 2025 17:30:05 +0800 Subject: [PATCH 6/7] Cleanups --- .../ComponentsXmlResourceTransformer.kt | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt index c1242154c..a28e0e68e 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformer.kt @@ -63,14 +63,16 @@ public open class ComponentsXmlResourceTransformer : ResourceTransformer { val children = newDom.getChild("components").getChildren("component") for (component in children) { - var role: String? = getValue(component, "role") - role = getRelocatedClass(role, context) + val role = getValue(component, "role").let { + context.relocators.relocateClass(it) + } setValue(component, "role", role) val roleHint = getValue(component, "role-hint") - var impl: String? = getValue(component, "implementation") - impl = getRelocatedClass(impl, context) + val impl = getValue(component, "implementation").let { + context.relocators.relocateClass(it) + } setValue(component, "implementation", impl) val key = "$role:$roleHint" @@ -84,8 +86,9 @@ public open class ComponentsXmlResourceTransformer : ResourceTransformer { if (requirements != null && requirements.childCount > 0) { for (r in requirements.childCount - 1 downTo 0) { val requirement = requirements.getChild(r) - var requiredRole: String? = getValue(requirement, "role") - requiredRole = getRelocatedClass(requiredRole, context) + val requiredRole = getValue(requirement, "role").let { + context.relocators.relocateClass(it) + } setValue(requirement, "role", requiredRole) } } @@ -105,10 +108,6 @@ public open class ComponentsXmlResourceTransformer : ResourceTransformer { public companion object { public const val COMPONENTS_XML_PATH: String = "META-INF/plexus/components.xml" - private fun getRelocatedClass(className: String?, context: TransformerContext): String? { - return className?.let { context.relocators.relocateClass(it) } - } - private fun getValue(dom: Xpp3Dom, element: String): String { return dom.getChild(element).value.orEmpty() } From a979eb4aa358544bb23aa571242834a056cf7dfa Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 2 Sep 2025 17:35:34 +0800 Subject: [PATCH 7/7] 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 9fbe75076..7f4ace798 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -3,6 +3,10 @@ ## [Unreleased](https://github.com/GradleUp/shadow/compare/9.1.0...HEAD) - 2025-xx-xx +### Added + +- Add extensions for `Iterable`. ([#1710](https://github.com/GradleUp/shadow/pull/1710)) + ### Changed - Merge Gradle Module descriptors into the modern `META-INF` path. ([#1706](https://github.com/GradleUp/shadow/pull/1706))