diff --git a/src/main/kotlin/com/jaredsburrows/license/LicenseReportTask.kt b/src/main/kotlin/com/jaredsburrows/license/LicenseReportTask.kt index 30f07af8..dba30bd5 100644 --- a/src/main/kotlin/com/jaredsburrows/license/LicenseReportTask.kt +++ b/src/main/kotlin/com/jaredsburrows/license/LicenseReportTask.kt @@ -18,6 +18,8 @@ import java.util.UUID import org.gradle.api.DefaultTask import org.gradle.api.Task import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.ResolvedArtifact +import org.gradle.api.artifacts.ResolvedDependency import org.gradle.api.logging.LogLevel import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal @@ -102,21 +104,45 @@ open class LicenseReportTask : DefaultTask() { // tasks can't be final } // Iterate through all the configurations's dependencies - configurationSet.forEach { set -> - if (set.isCanBeResolved) { - set.resolvedConfiguration.lenientConfiguration.allModuleDependencies.forEach { - if (it.configuration == "runtime") { - it.allModuleArtifacts.forEach { artifact -> - val id = artifact.moduleVersion.id - val gav = "${id.group}:${id.name}:${id.version}@pom" - configurations.getByName(pomConfiguration).dependencies.add( - project.dependencies.add(pomConfiguration, gav) - ) - } - } + configurationSet.forEach { configuration -> + if (configuration.isCanBeResolved) { + val allDeps = configuration.resolvedConfiguration.lenientConfiguration.allModuleDependencies + getResolvedArtifactsFromResolvedDependencies(allDeps).forEach { artifact -> + val id = artifact.moduleVersion.id + val gav = "${id.group}:${id.name}:${id.version}@pom" + configurations.getByName(pomConfiguration).dependencies.add( + project.dependencies.add(pomConfiguration, gav) + ) + } + } + } + } + + private fun getResolvedArtifactsFromResolvedDependencies( + resolvedDependencies: Set + ): Set { + + val resolvedArtifacts = HashSet() + for (resolvedDependency in resolvedDependencies) { + try { + if (resolvedDependency.moduleVersion == "unspecified") { + /** + * Attempting to getAllModuleArtifacts on a local library project will result + * in AmbiguousVariantSelectionException as there are not enough criteria + * to match a specific variant of the library project. Instead we skip the + * the library project itself and enumerate its dependencies. + */ + resolvedArtifacts.addAll( + getResolvedArtifactsFromResolvedDependencies( + resolvedDependency.children)) + } else { + resolvedArtifacts.addAll(resolvedDependency.allModuleArtifacts) } + } catch (exception: Exception) { + logger.warn("Failed to process $resolvedDependency.name", exception) } } + return resolvedArtifacts } /** Get POM information from the dependency artifacts. */