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:
+37
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
+15
-3
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user