[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.internal.JavaSourceSetsAccessor
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmCompilation
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
|
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.tasks.withType
|
||||||
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
|
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.cast
|
import org.jetbrains.kotlin.utils.addToStdlib.cast
|
||||||
@@ -86,6 +87,12 @@ abstract class KotlinJvmTarget @Inject constructor(
|
|||||||
setupDependenciesCrossInclusionForJava(compilation, javaSourceSet)
|
setupDependenciesCrossInclusionForJava(compilation, javaSourceSet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
project.afterEvaluate {
|
||||||
|
javaSourceSets.all { javaSourceSet ->
|
||||||
|
copyUserDefinedAttributesToJavaConfigurations(javaSourceSet)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Eliminate the Java output configurations from dependency resolution to avoid ambiguity between them and
|
// Eliminate the Java output configurations from dependency resolution to avoid ambiguity between them and
|
||||||
// the equivalent configurations created for the target:
|
// the equivalent configurations created for the target:
|
||||||
listOf(JavaPlugin.API_ELEMENTS_CONFIGURATION_NAME, JavaPlugin.RUNTIME_ELEMENTS_CONFIGURATION_NAME)
|
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.
|
* Check if "compile" and "runtime" configurations are still available in current Gradle version.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user