diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/JavaPluginsTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/JavaPluginsTest.kt index 7123ba48a..1d05b6109 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/JavaPluginsTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/JavaPluginsTest.kt @@ -714,7 +714,7 @@ class JavaPluginsTest : BasePluginTest() { description = 'Create a combined JAR of project and test dependencies' archiveClassifier = 'test' from sourceSets.named('test').map { it.output } - configurations = project.configurations.named('testRuntimeClasspath').map { [it] } + setConfigurations([project.configurations.testRuntimeClasspath]) manifest { attributes '$mainClassAttributeKey': 'my.Main' } @@ -751,7 +751,7 @@ class JavaPluginsTest : BasePluginTest() { description = 'Create a combined JAR of project and test dependencies' archiveClassifier = 'test' from sourceSets.named('test').map { it.output } - configurations = project.configurations.named('testRuntimeClasspath').map { [it] } + setConfigurations([project.configurations.testRuntimeClasspath]) manifest { attributes '$mainClassAttributeKey': 'my.Main' } @@ -795,7 +795,7 @@ class JavaPluginsTest : BasePluginTest() { def $dependencyShadowJar = tasks.register('$dependencyShadowJar', ${ShadowJar::class.java.name}) { description = 'Create a shadow JAR of all dependencies' archiveClassifier = 'dep' - configurations = project.configurations.named('runtimeClasspath').map { [it] } + setConfigurations([project.configurations.runtimeClasspath]) } """ .trimIndent() @@ -1185,7 +1185,7 @@ class JavaPluginsTest : BasePluginTest() { } $shadowJarTask { - configurations = [project.configurations.runtimeClasspath] + setConfigurations([project.configurations.runtimeClasspath]) } configurations.runtimeClasspath { diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/PublishingTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/PublishingTest.kt index 754ce1caf..1a419d9f5 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/PublishingTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/PublishingTest.kt @@ -305,7 +305,7 @@ class PublishingTest : BasePluginTest() { description = 'Create a combined JAR of project and test dependencies' archiveClassifier = 'tests' from sourceSets.named('test').map { it.output } - configurations = project.configurations.named('testRuntimeClasspath').map { [it] } + setConfigurations([project.configurations.testRuntimeClasspath]) } """ .trimIndent(), diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/RelocationTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/RelocationTest.kt index 68d23bc75..ee2a853ea 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/RelocationTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/RelocationTest.kt @@ -466,7 +466,7 @@ class RelocationTest : BasePluginTest() { implementation 'junit:junit:3.8.2' } $shadowJarTask { - configurations = [] + clearConfigurations() relocate('', 'foo/') } """ diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt index 68aae0281..c164b08e7 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt @@ -42,7 +42,7 @@ constructor(private val softwareComponentFactory: SoftwareComponentFactory) : Pl val taskProvider = registerShadowJarCommon(tasks.named("jar", Jar::class.java)) { task -> task.from(sourceSets.named("main").map { it.output }) - task.configurations.convention(provider { listOf(runtimeConfiguration) }) + task.addConfiguration(runtimeConfiguration) } artifacts.add(configurations.shadow.name, taskProvider) } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowKmpPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowKmpPlugin.kt index 5cb4fe242..eb2209ccd 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowKmpPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowKmpPlugin.kt @@ -36,10 +36,8 @@ public abstract class ShadowKmpPlugin : Plugin { val kotlinJvmMain = target.compilations.named("main") registerShadowJarCommon(tasks.named(target.artifactsTaskName, Jar::class.java)) { task -> task.from(kotlinJvmMain.map { it.output.allOutputs }) - task.configurations.convention( - provider { - listOf(configurations.getByName(kotlinJvmMain.get().runtimeDependencyConfigurationName)) - } + task.addConfiguration( + configurations.getByName(kotlinJvmMain.get().runtimeDependencyConfigurationName) ) if (!isAtLeastKgp("1.9.0")) return@registerShadowJarCommon diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.kt index 3bb828c73..ae7e8a849 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.kt @@ -72,6 +72,9 @@ public abstract class ShadowJar : Jar() { project.configurations.findByName(ShadowBasePlugin.CONFIGURATION_NAME) ?: project.files() } + @Transient + private val _sourceConfigurations = mutableListOf() + init { group = LifecycleBasePlugin.BUILD_GROUP description = "Create a combined JAR of project and runtime dependencies" @@ -101,7 +104,7 @@ public abstract class ShadowJar : Jar() { @get:Classpath public open val toMinimize: ConfigurableFileCollection = objectFactory.fileCollection { minimizeJar.map { - if (it) (dependencyFilterForMinimize.resolve(configurations.get()) - apiJars) else emptySet() + if (it) (dependencyFilterForMinimize.resolve(_sourceConfigurations) - apiJars) else emptySet() } } @@ -132,12 +135,34 @@ public abstract class ShadowJar : Jar() { @get:Nested public open val relocators: SetProperty = objectFactory.setProperty() /** - * The configurations to include dependencies from. + * The resolved files from configurations to include dependencies from. + * + * Do not add to this file collection directly. Use [addConfiguration], [setConfigurations], + * or [clearConfigurations] instead, so that dependency filtering works correctly. * * Defaults to a set that contains `runtimeClasspath` or `runtime` configuration. */ @get:Classpath - public open val configurations: SetProperty = objectFactory.setProperty() + public open val configurations: ConfigurableFileCollection = objectFactory.fileCollection() + + /** Add a [Configuration] whose dependencies should be shadowed. */ + public open fun addConfiguration(config: Configuration) { + _sourceConfigurations.add(config) + configurations.from(config) + } + + /** Replace all configurations with the given set. */ + public open fun setConfigurations(configs: Iterable) { + _sourceConfigurations.clear() + configurations.setFrom() + configs.forEach { addConfiguration(it) } + } + + /** Remove all configurations. */ + public open fun clearConfigurations() { + _sourceConfigurations.clear() + configurations.setFrom() + } @get:Input public open val dependencyFilter: Property = @@ -146,7 +171,7 @@ public abstract class ShadowJar : Jar() { /** Final dependencies to be shadowed. */ @get:Classpath public open val includedDependencies: ConfigurableFileCollection = objectFactory.fileCollection { - dependencyFilter.zip(configurations) { df, cs -> df.resolve(cs) } + dependencyFilter.map { df -> df.resolve(_sourceConfigurations) } } /** diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowPropertiesTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowPropertiesTest.kt index d5bf5e8f4..fb05e4b74 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowPropertiesTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowPropertiesTest.kt @@ -154,7 +154,7 @@ class ShadowPropertiesTest { assertThat(mainClass.orNull).isNull() assertThat(relocationPrefix.get()).isEqualTo(ShadowBasePlugin.SHADOW) - assertThat(configurations.get()).containsOnly(runtimeConfiguration) + assertThat(configurations.files).isEqualTo(runtimeConfiguration.files) } }