diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt index 7c35c6e2fc2..472d43facf4 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt @@ -876,6 +876,39 @@ class KotlinGradleIT : BaseGradleIT() { } } + @Test + fun testKotlinJvmProjectPublishesKotlinApiDependenciesAsCompile() = + with(Project("simpleProject", GradleVersionRequired.AtLeast("4.4"))) { + setupWorkingDir() + gradleBuildScript().appendText( + "\n" + """ + dependencies { + api 'org.jetbrains.kotlin:kotlin-reflect' + } + apply plugin: 'maven-publish' + group "com.example" + version "1.0" + publishing { + repositories { maven { url file("${'$'}buildDir/repo").toURI() } } + publications { maven(MavenPublication) { from components.java } } + } + """.trimIndent() + ) + build("publish") { + assertSuccessful() + val pomText = projectDir.resolve("build/repo/com/example/simpleProject/1.0/simpleProject-1.0.pom").readText() + .replace("\\s+|\\n".toRegex(), "") + assertTrue { + pomText.contains( + "org.jetbrains.kotlin" + + "kotlin-reflect" + + "${defaultBuildOptions().kotlinVersion}" + + "compile" + ) + } + } + } + @Test fun testNoTaskConfigurationForcing() { val gradleVersionRequirement = GradleVersionRequired.AtLeast("4.9") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 7ecfc58f003..2b74b13a0ce 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -454,6 +454,18 @@ internal abstract class AbstractKotlinPlugin( val kotlinSourceSet = project.kotlinExtension.sourceSets.maybeCreate(kotlinCompilation.defaultSourceSetName) kotlinCompilation.source(kotlinSourceSet) } + + // Since the 'java' plugin (as opposed to 'java-library') doesn't known anything about the 'api' configurations, + // add the API dependencies of the main compilation directly to the 'apiElements' configuration, so that the 'api' dependencies + // are properly published with the 'compile' scope (KT-28355): + project.whenEvaluated { + project.configurations.apply { + val apiElementsConfiguration = getByName(kotlinTarget.apiElementsConfigurationName) + val mainCompilation = kotlinTarget.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) + val compilationApiConfiguration = getByName(mainCompilation.apiConfigurationName) + apiElementsConfiguration.extendsFrom(compilationApiConfiguration) + } + } } private fun configureAttributes(