From 38de84d857268c2f974851ab1f3042835564cec7 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 1 Mar 2026 20:38:21 +0800 Subject: [PATCH 1/7] Add IP flag for all tests --- .../github/jengelman/gradle/plugins/shadow/BasePluginTest.kt | 3 --- .../github/jengelman/gradle/plugins/shadow/JavaPluginsTest.kt | 1 - .../jengelman/gradle/plugins/shadow/testkit/GradleRunner.kt | 2 ++ 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt index b69e5b854..bfc12d07e 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/BasePluginTest.kt @@ -415,9 +415,6 @@ abstract class BasePluginTest { const val runShadowTask = "tasks.named('$SHADOW_RUN_TASK_NAME', JavaExec)" const val jarTask = "tasks.named('jar', Jar)" - // TODO: enable this flag for all tests once we have fixed all issues with isolated projects. - // See https://github.com/GradleUp/shadow/pull/1139. - const val ipArgument = "-Dorg.gradle.unsafe.isolated-projects=true" const val infoArgument = "--info" fun String.toProperties(): Properties = Properties().apply { load(byteInputStream()) } 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 2273c29f0..8b3616ad6 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 @@ -871,7 +871,6 @@ class JavaPluginsTest : BasePluginTest() { val result = runWithSuccess( serverShadowJarPath, - ipArgument, infoArgument, "-P${ENABLE_DEVELOCITY_INTEGRATION_PROPERTY}=true", "-Dscan.dump", // Using scan.dump avoids actually publishing a Build Scan, writing it to a diff --git a/src/testKit/kotlin/com/github/jengelman/gradle/plugins/shadow/testkit/GradleRunner.kt b/src/testKit/kotlin/com/github/jengelman/gradle/plugins/shadow/testkit/GradleRunner.kt index 3b5707575..2175a5a3d 100644 --- a/src/testKit/kotlin/com/github/jengelman/gradle/plugins/shadow/testkit/GradleRunner.kt +++ b/src/testKit/kotlin/com/github/jengelman/gradle/plugins/shadow/testkit/GradleRunner.kt @@ -28,6 +28,8 @@ val commonGradleArgs = "--stacktrace", // https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:usage:parallel "-Dorg.gradle.configuration-cache.parallel=true", + // https://docs.gradle.org/current/userguide/isolated_projects.html#how_do_i_use_it + "-Dorg.gradle.unsafe.isolated-projects=true", ) fun gradleRunner( From 9d4c350a1e6806bbf6e4a53f8cb1f1a5020e26bf Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 1 Mar 2026 21:12:26 +0800 Subject: [PATCH 2/7] First round --- .../gradle/plugins/shadow/JavaPluginsTest.kt | 2 +- .../plugins/shadow/internal/UnusedTracker.kt | 81 ++++++++++--------- .../gradle/plugins/shadow/tasks/ShadowJar.kt | 13 ++- 3 files changed, 57 insertions(+), 39 deletions(-) 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 8b3616ad6..3e1b32ab3 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 @@ -200,7 +200,7 @@ class JavaPluginsTest : BasePluginTest() { .appendText( """ sourceSets { - custom + create('custom') } dependencies { implementation sourceSets.custom.output diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt index e9b09ba44..fa4ea1b11 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt @@ -3,10 +3,6 @@ package com.github.jengelman.gradle.plugins.shadow.internal import java.io.File import org.gradle.api.Project import org.gradle.api.artifacts.Configuration -import org.gradle.api.artifacts.Dependency -import org.gradle.api.artifacts.ExternalModuleDependency -import org.gradle.api.artifacts.FileCollectionDependency -import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.file.FileCollection import org.gradle.api.tasks.InputFiles import org.vafer.jdependency.Clazzpath @@ -43,42 +39,53 @@ internal class UnusedTracker( } companion object { - fun getApiJarsFromProject(project: Project): FileCollection { - val apiDependencies = - project.configurations.findByName("api")?.dependencies ?: return project.files() - val runtimeConfiguration = project.runtimeConfiguration - val apiJars = mutableListOf() - apiDependencies.forEach { dep -> - when (dep) { - is ProjectDependency -> { - apiJars.addAll(getApiJarsFromProject(project.project(dep.path))) - addJar(runtimeConfiguration, dep, apiJars) - } - is FileCollectionDependency -> { - apiJars.addAll(dep.files) - } - // Skip BOM dependencies and other non-JAR dependencies. - is ExternalModuleDependency -> Unit - else -> { - addJar(runtimeConfiguration, dep, apiJars) - val jarFile = - runtimeConfiguration.find { it.name.startsWith("${dep.name}-") } ?: return@forEach - apiJars.add(jarFile) + fun getApiJarsFromProject(project: Project, apiConfig: Configuration): FileCollection { + val extension = + project.extensions.findByType(org.gradle.api.plugins.JavaPluginExtension::class.java) + if (extension == null) return project.files() + + val shadowApiConfig = + project.configurations.create( + "shadowMinimizeApi_${java.util.UUID.randomUUID().toString().substring(0, 8)}" + ) { + it.isCanBeResolved = true + it.isCanBeConsumed = false + it.attributes { attrs -> + attrs.attribute( + org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE, + project.objects.named( + org.gradle.api.attributes.Usage::class.java, + org.gradle.api.attributes.Usage.JAVA_API, + ), + ) + attrs.attribute( + org.gradle.api.attributes.Category.CATEGORY_ATTRIBUTE, + project.objects.named( + org.gradle.api.attributes.Category::class.java, + org.gradle.api.attributes.Category.LIBRARY, + ), + ) + attrs.attribute( + org.gradle.api.attributes.LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + project.objects.named( + org.gradle.api.attributes.LibraryElements::class.java, + org.gradle.api.attributes.LibraryElements.JAR, + ), + ) } + it.extendsFrom(apiConfig) } - } - return project.files(apiJars) - } - private fun addJar(config: Configuration, dep: Dependency, result: MutableList) { - config.find { isProjectDependencyFile(it, dep) }?.let { result.add(it) } - } - - private fun isProjectDependencyFile(file: File, dep: Dependency): Boolean { - val fileName = file.name - val dependencyName = dep.name - return fileName == "$dependencyName.jar" || - (fileName.startsWith("$dependencyName-") && fileName.endsWith(".jar")) + return project.files( + project.provider { + shadowApiConfig.resolvedConfiguration.resolvedArtifacts + .filter { artifact -> + artifact.id.componentIdentifier !is + org.gradle.api.artifacts.component.ModuleComponentIdentifier + } + .map { it.file } + } + ) } } } 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 a3e65c159..abcc9b78d 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 @@ -108,7 +108,18 @@ public abstract class ShadowJar : Jar() { @get:Classpath public open val apiJars: ConfigurableFileCollection = objectFactory.fileCollection { - minimizeJar.map { if (it) UnusedTracker.getApiJarsFromProject(project) else emptySet() } + minimizeJar.map { + if (it) { + val apiConfig = project.configurations.findByName("api") + if (apiConfig != null) { + UnusedTracker.getApiJarsFromProject(project, apiConfig) + } else { + emptySet() + } + } else { + emptySet() + } + } } @get:InputFiles From 7ec6f56cec3e5fb318836e3218f692025dcf6afc Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 1 Mar 2026 21:24:43 +0800 Subject: [PATCH 3/7] Cleanups --- .../plugins/shadow/internal/UnusedTracker.kt | 52 ++++++++----------- .../gradle/plugins/shadow/tasks/ShadowJar.kt | 13 +---- 2 files changed, 24 insertions(+), 41 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt index fa4ea1b11..eb737e4bf 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt @@ -1,9 +1,15 @@ package com.github.jengelman.gradle.plugins.shadow.internal import java.io.File +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid import org.gradle.api.Project -import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.component.ModuleComponentIdentifier +import org.gradle.api.attributes.Category +import org.gradle.api.attributes.LibraryElements +import org.gradle.api.attributes.Usage import org.gradle.api.file.FileCollection +import org.gradle.api.plugins.JavaPlugin.API_CONFIGURATION_NAME import org.gradle.api.tasks.InputFiles import org.vafer.jdependency.Clazzpath import org.vafer.jdependency.ClazzpathUnit @@ -39,50 +45,38 @@ internal class UnusedTracker( } companion object { - fun getApiJarsFromProject(project: Project, apiConfig: Configuration): FileCollection { - val extension = - project.extensions.findByType(org.gradle.api.plugins.JavaPluginExtension::class.java) - if (extension == null) return project.files() + fun getApiJarsFromProject(project: Project): FileCollection { + val apiConfiguration = + project.configurations.findByName(API_CONFIGURATION_NAME) ?: return project.files() val shadowApiConfig = - project.configurations.create( - "shadowMinimizeApi_${java.util.UUID.randomUUID().toString().substring(0, 8)}" + project.configurations.register( + @OptIn(ExperimentalUuidApi::class) + "shadowMinimizeApi_${Uuid.random().toString().substring(0, 8)}" ) { it.isCanBeResolved = true it.isCanBeConsumed = false it.attributes { attrs -> attrs.attribute( - org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE, - project.objects.named( - org.gradle.api.attributes.Usage::class.java, - org.gradle.api.attributes.Usage.JAVA_API, - ), + Usage.USAGE_ATTRIBUTE, + project.objects.named(Usage::class.java, Usage.JAVA_API), ) attrs.attribute( - org.gradle.api.attributes.Category.CATEGORY_ATTRIBUTE, - project.objects.named( - org.gradle.api.attributes.Category::class.java, - org.gradle.api.attributes.Category.LIBRARY, - ), + Category.CATEGORY_ATTRIBUTE, + project.objects.named(Category::class.java, Category.LIBRARY), ) attrs.attribute( - org.gradle.api.attributes.LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, - project.objects.named( - org.gradle.api.attributes.LibraryElements::class.java, - org.gradle.api.attributes.LibraryElements.JAR, - ), + LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + project.objects.named(LibraryElements::class.java, LibraryElements.JAR), ) } - it.extendsFrom(apiConfig) + it.extendsFrom(apiConfiguration) } return project.files( - project.provider { - shadowApiConfig.resolvedConfiguration.resolvedArtifacts - .filter { artifact -> - artifact.id.componentIdentifier !is - org.gradle.api.artifacts.component.ModuleComponentIdentifier - } + shadowApiConfig.map { shadowApi -> + shadowApi.resolvedConfiguration.resolvedArtifacts + .filter { artifact -> artifact.id.componentIdentifier !is ModuleComponentIdentifier } .map { it.file } } ) 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 abcc9b78d..a3e65c159 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 @@ -108,18 +108,7 @@ public abstract class ShadowJar : Jar() { @get:Classpath public open val apiJars: ConfigurableFileCollection = objectFactory.fileCollection { - minimizeJar.map { - if (it) { - val apiConfig = project.configurations.findByName("api") - if (apiConfig != null) { - UnusedTracker.getApiJarsFromProject(project, apiConfig) - } else { - emptySet() - } - } else { - emptySet() - } - } + minimizeJar.map { if (it) UnusedTracker.getApiJarsFromProject(project) else emptySet() } } @get:InputFiles From 1b233e6b2510355fb498dae7e51589b9f0b2feac Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 1 Mar 2026 21:57:32 +0800 Subject: [PATCH 4/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 19eec4a8b..5fced3014 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -3,6 +3,10 @@ ## [Unreleased](https://github.com/GradleUp/shadow/compare/9.3.2...HEAD) - 2026-xx-xx +### Added + +- Support Isolated Projects. ([#1139](https://github.com/GradleUp/shadow/pull/1139)) + ### Changed - Allow opting out of adding `shadowJar` into `assemble` lifecycle. ([#1939](https://github.com/GradleUp/shadow/pull/1939)) From 45c8590c6097d9b380db4de7935ce58b8bf6d51d Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 1 Mar 2026 21:59:53 +0800 Subject: [PATCH 5/7] New `Project.getApiJars` --- .../plugins/shadow/internal/UnusedTracker.kt | 72 +++++++++---------- .../gradle/plugins/shadow/tasks/ShadowJar.kt | 3 +- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt index eb737e4bf..281e823a3 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt @@ -10,10 +10,43 @@ import org.gradle.api.attributes.LibraryElements import org.gradle.api.attributes.Usage import org.gradle.api.file.FileCollection import org.gradle.api.plugins.JavaPlugin.API_CONFIGURATION_NAME +import org.gradle.api.provider.Provider import org.gradle.api.tasks.InputFiles import org.vafer.jdependency.Clazzpath import org.vafer.jdependency.ClazzpathUnit +internal fun Project.getApiJars(): Provider> { + val apiConfiguration = + configurations.findByName(API_CONFIGURATION_NAME) ?: return provider { emptyList() } + + val shadowApiConfig = + configurations.register( + @OptIn(ExperimentalUuidApi::class) + "shadowMinimizeApi_${Uuid.random().toString().substring(0, 8)}" + ) { + it.isCanBeResolved = true + it.isCanBeConsumed = false + it.attributes { attrs -> + attrs.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, Usage.JAVA_API)) + attrs.attribute( + Category.CATEGORY_ATTRIBUTE, + objects.named(Category::class.java, Category.LIBRARY), + ) + attrs.attribute( + LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + objects.named(LibraryElements::class.java, LibraryElements.JAR), + ) + } + it.extendsFrom(apiConfiguration) + } + + return shadowApiConfig.map { shadowApi -> + shadowApi.resolvedConfiguration.resolvedArtifacts + .filter { artifact -> artifact.id.componentIdentifier !is ModuleComponentIdentifier } + .map { it.file } + } +} + /** Tracks unused classes in the project classpath. */ internal class UnusedTracker( sourceSetsClassesDirs: Iterable, @@ -43,43 +76,4 @@ internal class UnusedTracker( cp.addClazzpathUnit(jarOrDir) } } - - companion object { - fun getApiJarsFromProject(project: Project): FileCollection { - val apiConfiguration = - project.configurations.findByName(API_CONFIGURATION_NAME) ?: return project.files() - - val shadowApiConfig = - project.configurations.register( - @OptIn(ExperimentalUuidApi::class) - "shadowMinimizeApi_${Uuid.random().toString().substring(0, 8)}" - ) { - it.isCanBeResolved = true - it.isCanBeConsumed = false - it.attributes { attrs -> - attrs.attribute( - Usage.USAGE_ATTRIBUTE, - project.objects.named(Usage::class.java, Usage.JAVA_API), - ) - attrs.attribute( - Category.CATEGORY_ATTRIBUTE, - project.objects.named(Category::class.java, Category.LIBRARY), - ) - attrs.attribute( - LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, - project.objects.named(LibraryElements::class.java, LibraryElements.JAR), - ) - } - it.extendsFrom(apiConfiguration) - } - - return project.files( - shadowApiConfig.map { shadowApi -> - shadowApi.resolvedConfiguration.resolvedArtifacts - .filter { artifact -> artifact.id.componentIdentifier !is ModuleComponentIdentifier } - .map { it.file } - } - ) - } - } } 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 a3e65c159..ff4206809 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 @@ -8,6 +8,7 @@ import com.github.jengelman.gradle.plugins.shadow.internal.MinimizeDependencyFil import com.github.jengelman.gradle.plugins.shadow.internal.UnusedTracker import com.github.jengelman.gradle.plugins.shadow.internal.classPathAttributeKey import com.github.jengelman.gradle.plugins.shadow.internal.fileCollection +import com.github.jengelman.gradle.plugins.shadow.internal.getApiJars import com.github.jengelman.gradle.plugins.shadow.internal.mainClassAttributeKey import com.github.jengelman.gradle.plugins.shadow.internal.multiReleaseAttributeKey import com.github.jengelman.gradle.plugins.shadow.internal.property @@ -108,7 +109,7 @@ public abstract class ShadowJar : Jar() { @get:Classpath public open val apiJars: ConfigurableFileCollection = objectFactory.fileCollection { - minimizeJar.map { if (it) UnusedTracker.getApiJarsFromProject(project) else emptySet() } + minimizeJar.map { if (it) project.getApiJars() else emptySet() } } @get:InputFiles From 504df7e8797e0cbaadb9ff103dc27e7c089af064 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 1 Mar 2026 22:26:01 +0800 Subject: [PATCH 6/7] Reuse the config name --- .../plugins/shadow/internal/UnusedTracker.kt | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt index 281e823a3..a8669cb8c 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt @@ -1,8 +1,6 @@ package com.github.jengelman.gradle.plugins.shadow.internal import java.io.File -import kotlin.uuid.ExperimentalUuidApi -import kotlin.uuid.Uuid import org.gradle.api.Project import org.gradle.api.artifacts.component.ModuleComponentIdentifier import org.gradle.api.attributes.Category @@ -19,25 +17,27 @@ internal fun Project.getApiJars(): Provider> { val apiConfiguration = configurations.findByName(API_CONFIGURATION_NAME) ?: return provider { emptyList() } + val configName = "shadowMinimizeApi" val shadowApiConfig = - configurations.register( - @OptIn(ExperimentalUuidApi::class) - "shadowMinimizeApi_${Uuid.random().toString().substring(0, 8)}" - ) { - it.isCanBeResolved = true - it.isCanBeConsumed = false - it.attributes { attrs -> - attrs.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, Usage.JAVA_API)) - attrs.attribute( - Category.CATEGORY_ATTRIBUTE, - objects.named(Category::class.java, Category.LIBRARY), - ) - attrs.attribute( - LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, - objects.named(LibraryElements::class.java, LibraryElements.JAR), - ) + if (configurations.names.contains(configName)) { + configurations.named(configName) + } else { + configurations.register(configName) { + it.isCanBeResolved = true + it.isCanBeConsumed = false + it.attributes { attrs -> + attrs.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, Usage.JAVA_API)) + attrs.attribute( + Category.CATEGORY_ATTRIBUTE, + objects.named(Category::class.java, Category.LIBRARY), + ) + attrs.attribute( + LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + objects.named(LibraryElements::class.java, LibraryElements.JAR), + ) + } + it.extendsFrom(apiConfiguration) } - it.extendsFrom(apiConfiguration) } return shadowApiConfig.map { shadowApi -> From eecb1885a7ba3923847e162061dc2d7dc94095a6 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sun, 1 Mar 2026 23:13:00 +0800 Subject: [PATCH 7/7] Call `incoming.artifacts` --- .../gradle/plugins/shadow/internal/UnusedTracker.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt index a8669cb8c..d7b7bd88b 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/UnusedTracker.kt @@ -40,10 +40,10 @@ internal fun Project.getApiJars(): Provider> { } } - return shadowApiConfig.map { shadowApi -> - shadowApi.resolvedConfiguration.resolvedArtifacts - .filter { artifact -> artifact.id.componentIdentifier !is ModuleComponentIdentifier } - .map { it.file } + return shadowApiConfig.flatMap { shadowApi -> + shadowApi.incoming.artifacts.resolvedArtifacts.map { artifacts -> + artifacts.filter { it.id.componentIdentifier !is ModuleComponentIdentifier }.map { it.file } + } } }