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) {