[Gradle] Propagate user-defined attributes to Java Configurations

Java Compilation classpath should have the same user-defined attributes
as Kotlin Compilation.
This also prevents from Gradle variant resolution failures on
Java Configurations in case if user-defined attributes
resolve that ambiguity.

^KT-31468 Verification Pending
This commit is contained in:
Anton Lakotka
2022-07-28 09:51:39 +02:00
committed by Space
parent 8bb2fe47f4
commit 3eb0868d5b
@@ -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<String>()
?.takeIf { project.configurations.findByName(it) != null }
} else null
val runtimeConfigurationName = if (areRuntimeOrCompileConfigurationsAvailable()) {
javaSourceSet::class
.functions
.find { it.name == "getRuntimeConfigurationName" }
?.call(javaSourceSet)
?.cast<String>()
?.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.
*/