[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:
+42
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user