diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithoutKotlincTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithoutKotlincTask.kt index ff6c5d689e2..617ba6fde91 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithoutKotlincTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithoutKotlincTask.kt @@ -100,19 +100,24 @@ private class KaptExecution @Inject constructor( private const val JAVAC_CONTEXT_CLASS = "com.sun.tools.javac.util.Context" private fun kaptClass(classLoader: ClassLoader) = Class.forName("org.jetbrains.kotlin.kapt3.base.Kapt", true, classLoader) + private var cachedClassLoaderWithToolsJar: ClassLoader? = null + private var cachedKaptClassLoader: ClassLoader? = null } override fun run(): Unit = with(optionsForWorker) { val kaptClasspathUrls = kaptClasspath.map { it.toURI().toURL() }.toTypedArray() val rootClassLoader = findRootClassLoader() - val classLoaderWithToolsJar = if (toolsJar != null && !javacIsAlreadyHere()) { + val classLoaderWithToolsJar = cachedClassLoaderWithToolsJar ?: if (toolsJar != null && !javacIsAlreadyHere()) { URLClassLoader(arrayOf(toolsJar.toURI().toURL()), rootClassLoader) } else { rootClassLoader } + cachedClassLoaderWithToolsJar = classLoaderWithToolsJar + + val kaptClassLoader = cachedKaptClassLoader ?: URLClassLoader(kaptClasspathUrls, classLoaderWithToolsJar) + cachedKaptClassLoader = kaptClassLoader - val kaptClassLoader = URLClassLoader(kaptClasspathUrls, classLoaderWithToolsJar) val kaptMethod = kaptClass(kaptClassLoader).declaredMethods.single { it.name == "kapt" } kaptMethod.invoke(null, createKaptOptions(kaptClassLoader)) }