From ee73373441ac96e8d3d6caa9cea72465b07765f5 Mon Sep 17 00:00:00 2001 From: ligee Date: Fri, 17 Jul 2015 18:38:33 +0200 Subject: [PATCH] Implementing simple classloading for plugin core, since embeddable compiler allows it --- .../gradle/plugin/KotlinPluginWrapper.kt | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index d03daf91acf..cb03e49b53c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -13,10 +13,15 @@ import org.gradle.api.invocation.Gradle import org.gradle.api.logging.Logger import java.lang.reflect.Method import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider +import java.net.URLClassLoader abstract class KotlinBasePluginWrapper: Plugin { val log = Logging.getLogger(this.javaClass) + companion object { + var pluginClassLoader: ClassLoader? = null + } + public override fun apply(project: Project) { val sourceBuildScript = findSourceBuildScript(project) @@ -29,16 +34,34 @@ abstract class KotlinBasePluginWrapper: Plugin { val kotlinPluginVersion = loadKotlinVersionFromResource(log) project.getExtensions().getExtraProperties()?.set("kotlin.gradle.plugin.version", kotlinPluginVersion) - val pluginClassLoader = createPluginIsolatedClassLoader(kotlinPluginVersion, sourceBuildScript) - val plugin = getPlugin(pluginClassLoader, sourceBuildScript) + if (pluginClassLoader == null) + pluginClassLoader = createPluginClassLoader(kotlinPluginVersion, sourceBuildScript) + val plugin = getPlugin(pluginClassLoader!!, sourceBuildScript) plugin.apply(project) - project.getGradle().addBuildListener(FinishBuildListener(pluginClassLoader)) +// project.getGradle().addBuildListener(FinishBuildListener(pluginClassLoader)) } - protected abstract fun getPlugin(pluginClassLoader: ParentLastURLClassLoader, scriptHandler: ScriptHandler): Plugin + protected abstract fun getPlugin(pluginClassLoader: ClassLoader, scriptHandler: ScriptHandler): Plugin + + private fun createPluginClassLoader(projectVersion: String, sourceBuildScript: ScriptHandler): URLClassLoader { + val kotlinPluginDependencies: List = getPluginDependencies(projectVersion, sourceBuildScript) + log.kotlinDebug("Load plugin in regular URL classloader") + val kotlinPluginClassloader = URLClassLoader(kotlinPluginDependencies.toTypedArray(), this.javaClass.getClassLoader()) + + return kotlinPluginClassloader + } private fun createPluginIsolatedClassLoader(projectVersion: String, sourceBuildScript: ScriptHandler): ParentLastURLClassLoader { + val kotlinPluginDependencies: List = getPluginDependencies(projectVersion, sourceBuildScript) + log.kotlinDebug("Load plugin in parent-last URL classloader") + val kotlinPluginClassloader = ParentLastURLClassLoader(kotlinPluginDependencies, this.javaClass.getClassLoader()) + log.kotlinDebug("Class loader created") + + return kotlinPluginClassloader + } + + private fun getPluginDependencies(projectVersion: String, sourceBuildScript: ScriptHandler): List { val dependencyHandler: DependencyHandler = sourceBuildScript.getDependencies() val configurationsContainer: ConfigurationContainer = sourceBuildScript.getConfigurations() @@ -50,11 +73,7 @@ abstract class KotlinBasePluginWrapper: Plugin { log.kotlinDebug("Resolving [" + kotlinPluginCoreCoordinates + "]") val kotlinPluginDependencies: List = configuration.getResolvedConfiguration().getFiles({ true })!!.map { it.toURI().toURL() } log.kotlinDebug("Resolved files: [" + kotlinPluginDependencies.toString() + "]") - log.kotlinDebug("Load plugin in parent-last URL classloader") - val kotlinPluginClassloader = ParentLastURLClassLoader(kotlinPluginDependencies, this.javaClass.getClassLoader()) - log.kotlinDebug("Class loader created") - - return kotlinPluginClassloader + return kotlinPluginDependencies } private fun findSourceBuildScript(project: Project): ScriptHandler? { @@ -76,15 +95,15 @@ abstract class KotlinBasePluginWrapper: Plugin { } open class KotlinPluginWrapper: KotlinBasePluginWrapper() { - override fun getPlugin(pluginClassLoader: ParentLastURLClassLoader, scriptHandler: ScriptHandler) = KotlinPlugin(scriptHandler, KotlinTasksProvider(pluginClassLoader)) + override fun getPlugin(pluginClassLoader: ClassLoader, scriptHandler: ScriptHandler) = KotlinPlugin(scriptHandler, KotlinTasksProvider(pluginClassLoader)) } open class KotlinAndroidPluginWrapper : KotlinBasePluginWrapper() { - override fun getPlugin(pluginClassLoader: ParentLastURLClassLoader, scriptHandler: ScriptHandler) = KotlinAndroidPlugin(scriptHandler, KotlinTasksProvider(pluginClassLoader)) + override fun getPlugin(pluginClassLoader: ClassLoader, scriptHandler: ScriptHandler) = KotlinAndroidPlugin(scriptHandler, KotlinTasksProvider(pluginClassLoader)) } open class Kotlin2JsPluginWrapper : KotlinBasePluginWrapper() { - override fun getPlugin(pluginClassLoader: ParentLastURLClassLoader, scriptHandler: ScriptHandler) = Kotlin2JsPlugin(scriptHandler, KotlinTasksProvider(pluginClassLoader)) + override fun getPlugin(pluginClassLoader: ClassLoader, scriptHandler: ScriptHandler) = Kotlin2JsPlugin(scriptHandler, KotlinTasksProvider(pluginClassLoader)) } fun Logger.kotlinDebug(message: String) {