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 package org.jetbrains.kotlin.gradle
import com.intellij.testFramework.TestDataPath import com.intellij.testFramework.TestDataPath
import org.gradle.api.logging.LogLevel
import org.gradle.api.logging.configuration.WarningMode import org.gradle.api.logging.configuration.WarningMode
import org.jetbrains.kotlin.gradle.internals.KOTLIN_12X_MPP_DEPRECATION_WARNING import org.jetbrains.kotlin.gradle.internals.KOTLIN_12X_MPP_DEPRECATION_WARNING
import org.jetbrains.kotlin.gradle.plugin.EXPECTED_BY_CONFIG_NAME import org.jetbrains.kotlin.gradle.plugin.EXPECTED_BY_CONFIG_NAME
@@ -310,4 +311,40 @@ class MultiplatformGradleIT : BaseGradleIT() {
assertTasksExecuted(customSourceSetCompileTasks) 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.NamedDomainObjectContainer
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.api.tasks.testing.Test import org.gradle.api.tasks.testing.Test
import org.gradle.jvm.tasks.Jar import org.gradle.jvm.tasks.Jar
import org.gradle.language.jvm.tasks.ProcessResources
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.* 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): // sources are placed (i.e. src/jvmMain/java, src/jvmTest/java):
javaSourceSet.resources.setSrcDirs(compilation.defaultSourceSet.resources.sourceDirectories) javaSourceSet.resources.setSrcDirs(compilation.defaultSourceSet.resources.sourceDirectories)
compilation.defaultSourceSet.resources.srcDirs(javaSourceSet.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: // Resources processing is done with the Kotlin resource processing task:
val processJavaResourcesTask = project.tasks.getByName(javaSourceSet.processResourcesTaskName) project.tasks.named(javaSourceSet.processResourcesTaskName).configure {
processJavaResourcesTask.dependsOn(project.tasks.getByName(compilation.processResourcesTaskName)) it.dependsOn(project.tasks.named(compilation.processResourcesTaskName))
processJavaResourcesTask.enabled = false it.enabled = false
}
} }
private fun disableJavaPluginTasks(javaPluginConvention: JavaPluginConvention) { private fun disableJavaPluginTasks(javaPluginConvention: JavaPluginConvention) {