From 58a84115754657e26147407b134fc57885937de8 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Thu, 27 Sep 2018 00:39:04 +0300 Subject: [PATCH] Fix KNPE due to publications processing order in Gradle 4.7 A KNPE happened because Gradle 4.7 (but not 4.8+) requested a publication's dependencies before all other publications were created. Issue #KT-27231 Fixed --- .../org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt | 2 +- .../kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 6aa1002f402..8af92314d94 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -21,7 +21,7 @@ import kotlin.test.assertFalse import kotlin.test.assertTrue class NewMultiplatformIT : BaseGradleIT() { - val gradleVersion = GradleVersionRequired.AtLeast("4.8") + val gradleVersion = GradleVersionRequired.AtLeast("4.7") val nativeHostTargetName = when { HostManager.hostIsMingw -> "mingw64" diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index 30ca580baee..85b92dcf2bc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -132,8 +132,7 @@ class KotlinMultiplatformPlugin( publishTask.onlyIf { publishTask.publication != rootPublication || project.multiplatformExtension!!.isGradleMetadataAvailable } } - // Create separate publications for all publishable targets - targets.matching { it.publishable }.all { target -> + fun createTargetPublication(target: KotlinTarget) { val variant = target.component as KotlinVariant val name = target.name @@ -156,6 +155,10 @@ class KotlinMultiplatformPlugin( it.execute(variantPublication) } } + + // Enforce the order of creating the publications, since the metadata publication is used in the other publications: + createTargetPublication(targets.getByName(METADATA_TARGET_NAME)) + targets.matching { it.publishable && it.name != METADATA_TARGET_NAME }.all(::createTargetPublication) } project.components.add(kotlinSoftwareComponent)