From a2c874572a0f3cfd3bc46dcb1cb89beb7eb81d65 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 13 May 2023 22:37:24 +0200 Subject: [PATCH] [Gradle] Fix adding additional res dirs to KotlinSourceSet does not work In case of "org.jetbrains.kotlin.jvm" plugin Java SourceSet will create ProcessResources task copying all registered resources. ^KT-36904 Fixed --- .../kotlin/gradle/SimpleKotlinGradleIT.kt | 41 +++++++++++++++++-- .../gradle/plugin/AbstractKotlinPlugin.kt | 7 ++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SimpleKotlinGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SimpleKotlinGradleIT.kt index 9cd9f012d03..8245727ebaa 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SimpleKotlinGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SimpleKotlinGradleIT.kt @@ -6,10 +6,8 @@ import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy import org.jetbrains.kotlin.gradle.testbase.* import org.junit.jupiter.api.DisplayName -import kotlin.io.path.appendText -import kotlin.io.path.createDirectories -import kotlin.io.path.createFile import java.util.zip.ZipFile +import kotlin.io.path.* @JvmGradlePluginTests @DisplayName("KGP simple tests") @@ -320,4 +318,41 @@ class SimpleKotlinGradleIT : KGPBaseTest() { } } } + + @DisplayName("KT-36904: Adding resources to Kotlin source set should work") + @GradleTest + internal fun addResourcesKotlinSourceSet(gradleVersion: GradleVersion) { + project("simpleProject", gradleVersion) { + val mainResDir = projectPath.resolve("src/main/resources").apply { createDirectories() } + val mainResFile = mainResDir.resolve("main.txt").apply { writeText("Yay, Kotlin!") } + + val additionalResDir = projectPath.resolve("additionalRes").apply { createDirectory() } + val additionalResFile = additionalResDir.resolve("test.txt").apply { writeText("Kotlin!") } + + buildGradle.appendText( + //language=groovy + """ + | + |kotlin { + | sourceSets.main.resources.srcDir("additionalRes") + |} + """.trimMargin() + ) + + build("jar") { + assertFileInProjectExists("build/libs/simpleProject.jar") + ZipFile(projectPath.resolve("build/libs/simpleProject.jar").toFile()).use { jar -> + assert(jar.entries().asSequence().count { it.name == mainResFile.name } == 1) { + "The jar should contain one entry `${mainResFile.name}` with no duplicates\n" + + jar.entries().asSequence().map { it.name }.joinToString() + } + + assert(jar.entries().asSequence().count { it.name == additionalResFile.name } == 1) { + "The jar should contain one entry `${additionalResFile.name}` with no duplicates\n" + + jar.entries().asSequence().map { it.name }.joinToString() + } + } + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt index 37da76c6e7b..0d17e095d31 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt @@ -185,6 +185,13 @@ internal abstract class AbstractKotlinPlugin( if (duplicateJavaSourceSetsAsKotlinSourceSets) { val kotlinSourceSet = project.kotlinExtension.sourceSets.maybeCreate(kotlinCompilation.name) kotlinSourceSet.kotlin.source(javaSourceSet.java) + // Registering resources from KotlinSourceSet as Java SourceSet resources. In case of KotlinPlugin + // Java Sources set will create ProcessResources task to process all resources into output + // 'kotlinSourceSet.resources' should contain Java SourceSet default resource directories and to avoid + // duplication error we are replacing here already configured default one. + javaSourceSet.resources.setSrcDirs( + listOf { kotlinSourceSet.resources.sourceDirectories } + ) @Suppress("DEPRECATION") kotlinCompilation.source(kotlinSourceSet) project.compatibilityConventionRegistrar.addConvention(javaSourceSet, kotlinSourceSetDslName, kotlinSourceSet)