diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Plugins.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Plugins.kt index 1c1d9dd1..c31837b0 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Plugins.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Plugins.kt @@ -14,6 +14,7 @@ import com.beust.kobalt.misc.log import com.google.inject.Provider import java.lang.reflect.Method import java.lang.reflect.Modifier +import java.net.URLClassLoader import java.util.* import java.util.jar.JarFile import javax.inject.Inject @@ -148,7 +149,7 @@ class Plugins @Inject constructor (val taskManagerProvider : Provider() - fun installPlugins(dependencies: List, classLoader: ClassLoader) { + fun installPlugins(dependencies: List, scriptClassLoader: ClassLoader) { val executor = executors.newExecutor("Plugins", 5) dependencies.forEach { // @@ -161,7 +162,8 @@ class Plugins @Inject constructor (val taskManagerProvider : Provider() val projectContributors = arrayListOf() val classpathContributors = arrayListOf() @@ -112,16 +113,24 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { /** * Read a general kobalt-plugin.xml. */ - fun readPluginXml(ins: InputStream, classLoader: ClassLoader? = null): PluginInfo { + fun readPluginXml(ins: InputStream, pluginClassLoader: ClassLoader? = null, + classLoader: ClassLoader? = null): PluginInfo { val jaxbContext = JAXBContext.newInstance(KobaltPluginXml::class.java) - val kotlinPlugin: KobaltPluginXml = jaxbContext.createUnmarshaller().unmarshal(ins) + val kobaltPlugin: KobaltPluginXml = jaxbContext.createUnmarshaller().unmarshal(ins) as KobaltPluginXml - log(2, "Parsed plugin XML file, found: " + kotlinPlugin.name) - return PluginInfo(kotlinPlugin, classLoader) + log(2, "Parsed plugin XML file, found: " + kobaltPlugin.name) + val result = + try { + PluginInfo(kobaltPlugin, pluginClassLoader, classLoader) + } catch(ex: Exception) { + throw KobaltException("Couldn't create PluginInfo: " + ex.message, ex) + } + return result } - fun readPluginXml(s: String, classLoader: ClassLoader? = null) - = readPluginXml(ByteArrayInputStream(s.toByteArray(Charsets.UTF_8)), classLoader) + fun readPluginXml(s: String, pluginClassLoader: ClassLoader?, scriptClassLoader: ClassLoader? = null) + = readPluginXml(ByteArrayInputStream(s.toByteArray(Charsets.UTF_8)), pluginClassLoader, + scriptClassLoader) } init { @@ -132,7 +141,8 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { } fun forName(className: String) = - if (classLoader != null) classLoader.loadClass(className) + if (pluginClassLoader != null) pluginClassLoader.loadClass(className) + else if (classLoader != null) classLoader.loadClass(className) else Class.forName(className) //