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
This commit is contained in:
Yahor Berdnikau
2021-07-22 12:27:14 +02:00
committed by Space
parent 83023c2073
commit 5dc6e1b473
2 changed files with 52 additions and 3 deletions
@@ -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")
}
}
}
@@ -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) {