diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt index 94cb6021ba3..37c2ef48093 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes import org.jetbrains.kotlin.gradle.tasks.withType import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.utils.addToStdlib.cast @@ -86,6 +87,12 @@ abstract class KotlinJvmTarget @Inject constructor( setupDependenciesCrossInclusionForJava(compilation, javaSourceSet) } + project.afterEvaluate { + javaSourceSets.all { javaSourceSet -> + copyUserDefinedAttributesToJavaConfigurations(javaSourceSet) + } + } + // Eliminate the Java output configurations from dependency resolution to avoid ambiguity between them and // the equivalent configurations created for the target: listOf(JavaPlugin.API_ELEMENTS_CONFIGURATION_NAME, JavaPlugin.RUNTIME_ELEMENTS_CONFIGURATION_NAME) @@ -206,6 +213,41 @@ abstract class KotlinJvmTarget @Inject constructor( } } + private fun copyUserDefinedAttributesToJavaConfigurations(javaSourceSet: SourceSet) { + val compileConfigurationName = if (areRuntimeOrCompileConfigurationsAvailable()) { + javaSourceSet::class + .functions + .find { it.name == "getCompileConfigurationName" } + ?.call(javaSourceSet) + ?.cast() + ?.takeIf { project.configurations.findByName(it) != null } + } else null + + val runtimeConfigurationName = if (areRuntimeOrCompileConfigurationsAvailable()) { + javaSourceSet::class + .functions + .find { it.name == "getRuntimeConfigurationName" } + ?.call(javaSourceSet) + ?.cast() + ?.takeIf { project.configurations.findByName(it) != null } + } else null + + listOfNotNull( + compileConfigurationName, + javaSourceSet.compileClasspathConfigurationName, + runtimeConfigurationName, + javaSourceSet.runtimeClasspathConfigurationName, + javaSourceSet.apiConfigurationName, + javaSourceSet.implementationConfigurationName, + javaSourceSet.compileOnlyConfigurationName, + javaSourceSet.runtimeOnlyConfigurationName, + ).mapNotNull { + project.configurations.findByName(it) + }.forEach { configuration -> + copyAttributes(attributes, configuration.attributes) + } + } + /** * Check if "compile" and "runtime" configurations are still available in current Gradle version. */