From 5dc6e1b473d32755bfcec7b12525db41ff086a79 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Thu, 22 Jul 2021 12:27:14 +0200 Subject: [PATCH] Fix no duplicate strategy was set for compilation with 'withJava()'. In such case Kotlin jvm compilation has additionally java resource dir that points to the same location. So ProcessResources task copies same file twice. Fixed by setting ignore duplicates strategy. ^KT-46978 Fixed --- .../kotlin/gradle/MultiplatformGradleIT.kt | 37 +++++++++++++++++++ .../gradle/targets/jvm/KotlinJvmTarget.kt | 18 +++++++-- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt index 6b695ad3f46..810e2c51579 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.gradle import com.intellij.testFramework.TestDataPath +import org.gradle.api.logging.LogLevel import org.gradle.api.logging.configuration.WarningMode import org.jetbrains.kotlin.gradle.internals.KOTLIN_12X_MPP_DEPRECATION_WARNING import org.jetbrains.kotlin.gradle.plugin.EXPECTED_BY_CONFIG_NAME @@ -310,4 +311,40 @@ class MultiplatformGradleIT : BaseGradleIT() { assertTasksExecuted(customSourceSetCompileTasks) } } + + @Test + fun testWithJavaDuplicatedResourcesFail() = with( + Project( + projectName = "mpp-single-jvm-target", + gradleVersionRequirement = GradleVersionRequired.AtLeast("7.0"), + minLogLevel = LogLevel.WARN + ) + ) { + setupWorkingDir() + + gradleBuildScript().modify { buildFileContent -> + buildFileContent + .lines() + .joinToString(separator = "\n") { + if (it.contains("jvm()")) { + "jvm { withJava() }" + } else { + it + } + } + } + + val resDir = projectDir.resolve("src/jvmMain/resources").also { it.mkdirs() } + resDir.resolve("test.properties").writeText( + """ + one=true + two=false + """.trimIndent() + ) + + build("assemble") { + assertSuccessful() + assertNotContains("no duplicate handling strategy has been set") + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt index 6bcdeb6e9c7..25f01448d80 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt @@ -9,12 +9,14 @@ import org.gradle.api.InvalidUserCodeException import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.DuplicatesStrategy import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.api.tasks.testing.Test import org.gradle.jvm.tasks.Jar +import org.gradle.language.jvm.tasks.ProcessResources import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.* @@ -101,11 +103,21 @@ open class KotlinJvmTarget @Inject constructor( // sources are placed (i.e. src/jvmMain/java, src/jvmTest/java): javaSourceSet.resources.setSrcDirs(compilation.defaultSourceSet.resources.sourceDirectories) compilation.defaultSourceSet.resources.srcDirs(javaSourceSet.resources.sourceDirectories) + project.tasks.named( + compilation.processResourcesTaskName, + ProcessResources::class.java + ).configure { + // Now 'compilation' has additional resources dir from java compilation which points to the initial + // resources location. Because of this, ProcessResources task will copy same files twice, + // so we are excluding duplicates. + it.duplicatesStrategy = DuplicatesStrategy.EXCLUDE + } // Resources processing is done with the Kotlin resource processing task: - val processJavaResourcesTask = project.tasks.getByName(javaSourceSet.processResourcesTaskName) - processJavaResourcesTask.dependsOn(project.tasks.getByName(compilation.processResourcesTaskName)) - processJavaResourcesTask.enabled = false + project.tasks.named(javaSourceSet.processResourcesTaskName).configure { + it.dependsOn(project.tasks.named(compilation.processResourcesTaskName)) + it.enabled = false + } } private fun disableJavaPluginTasks(javaPluginConvention: JavaPluginConvention) {