diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt index 1173f9cadce..fbfc1ddb908 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt @@ -452,6 +452,7 @@ open class Kapt3IT : Kapt3BaseIT() { } build("assemble") { assertSuccessful() + assertContains("Annotation processors discovery from compile classpath is deprecated") } buildGradle.modify { @@ -459,6 +460,7 @@ open class Kapt3IT : Kapt3BaseIT() { } build("assemble") { assertFailed() + assertNotContains("Annotation processors discovery from compile classpath is deprecated") } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptTask.kt index 54758ac3dcd..10cdea1756e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptTask.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.gradle.tasks.cacheOnlyIfEnabledForKotlin import org.jetbrains.kotlin.gradle.tasks.isBuildCacheSupported import org.jetbrains.kotlin.gradle.utils.isJavaFile import java.io.File +import java.util.jar.JarFile @CacheableTask abstract class KaptTask : ConventionTask() { @@ -109,4 +110,53 @@ abstract class KaptTask : ConventionTask() { private fun FileCollection?.orEmpty(): FileCollection = this ?: project.files() + + protected fun checkAnnotationProcessorClasspath() { + if (!includeCompileClasspath) return + + val kaptClasspath = kaptClasspath.toSet() + val processorsFromCompileClasspath = classpath.files.filterTo(LinkedHashSet()) { + hasAnnotationProcessors(it) + } + val processorsAbsentInKaptClasspath = processorsFromCompileClasspath.filter { it !in kaptClasspath } + if (processorsAbsentInKaptClasspath.isNotEmpty()) { + if (logger.isInfoEnabled) { + logger.warn( + "Annotation processors discovery from compile classpath is deprecated." + + "\nSet 'kapt.includeCompileClasspath = false' to disable discovery." + + "\nThe following files, containing annotation processors, are not present in KAPT classpath:\n" + + processorsAbsentInKaptClasspath.joinToString("\n") { " '$it'" } + + "\nAdd corresponding dependencies to any of the following configurations:\n" + + kaptClasspathConfigurations.joinToString("\n") { " '${it.name}'" } + ) + } else { + logger.warn( + "Annotation processors discovery from compile classpath is deprecated." + + "\nSet 'kapt.includeCompileClasspath = false' to disable discovery." + + "\nRun the build with '--info' for more details." + ) + } + + } + } + + private fun hasAnnotationProcessors(file: File): Boolean { + val processorEntryPath = "META-INF/services/javax.annotation.processing.Processor" + + try { + when { + file.isDirectory -> { + return file.resolve(processorEntryPath).exists() + } + file.isFile && file.extension.equals("jar", ignoreCase = true) -> { + return JarFile(file).use { jar -> + jar.getJarEntry(processorEntryPath) != null + } + } + } + } catch (e: Exception) { + logger.debug("Could not check annotation processors existence in $file: $e") + } + return false + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt index 205c1039612..c416ff93365 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt @@ -54,6 +54,7 @@ open class KaptWithKotlincTask : KaptTask(), CompilerArgumentAwareWithInput