diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/PluginCliParser.kt b/compiler/cli/src/org/jetbrains/jet/cli/jvm/PluginCliParser.kt index 7476bd12b81..086955a1857 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/PluginCliParser.kt +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/PluginCliParser.kt @@ -35,6 +35,9 @@ import java.net.URL import java.io.File import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import java.util.ServiceLoader +import java.io.IOException +import java.util.Enumeration + public object PluginCliParser { @@ -42,7 +45,7 @@ public object PluginCliParser { [platformStatic] fun loadPlugins(arguments: CommonCompilerArguments, configuration: CompilerConfiguration) { - val classLoader = URLClassLoader( + val classLoader = PluginURLClassLoader( arguments.pluginClasspaths ?.map { File(it).toURI().toURL() } ?.copyToArray() @@ -115,4 +118,31 @@ public object PluginCliParser { return null } +} + +private class PluginURLClassLoader(urls: Array, parent: ClassLoader) : ClassLoader(Thread.currentThread().getContextClassLoader()) { + private val childClassLoader: SelfThenParentURLClassLoader = SelfThenParentURLClassLoader(urls, parent) + + override synchronized fun loadClass(name: String, resolve: Boolean): Class<*> { + return try { + childClassLoader.findClass(name) + } + catch (e: ClassNotFoundException) { + super.loadClass(name, resolve) + } + } + + override fun getResources(name: String) = childClassLoader.getResources(name) + + private class SelfThenParentURLClassLoader(urls: Array, val onFail: ClassLoader) : URLClassLoader(urls, null) { + + public override fun findClass(name: String): Class<*> { + return try { + super.findClass(name) + } catch (e: ClassNotFoundException) { + onFail.loadClass(name) + } + + } + } } \ No newline at end of file