Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

load plugin classes in a single class loader across builds. fixes #329

  • Loading branch information...
commit bda151c3bdf44ca63f784a7c70cc56ad5bdedb88 1 parent 0fbe987
@harrah authored
View
4 main/BuildLoader.scala
@@ -123,10 +123,10 @@ final class BuildLoader(
full.setRoot(loaders.full),
loaders.transformAll andThen transformAll
)
- def updatePluginManagement(overrides: Set[ModuleID], loader: ClassLoader): BuildLoader =
+ def updatePluginManagement(overrides: Set[ModuleID]): BuildLoader =
{
val mgmt = config.pluginManagement
- val newConfig = config.copy(pluginManagement = mgmt.copy(overrides = mgmt.overrides ++ overrides, loader = loader))
+ val newConfig = config.copy(pluginManagement = mgmt.copy(overrides = mgmt.overrides ++ overrides))
new BuildLoader(fail, state, newConfig, resolvers, builders, transformer, full, transformAll)
}
def components = new Components(resolvers.applyFun, builders.applyFun, transformer, full.applyFun, transformAll)
View
10 main/Load.scala
@@ -249,10 +249,8 @@ object Load
newLoaders transformAll build
}
def addOverrides(unit: BuildUnit, loaders: BuildLoader): BuildLoader =
- {
- val overrides = PluginManagement.extractOverrides(unit.plugins.fullClasspath)
- loaders.updatePluginManagement(overrides, unit.plugins.loader)
- }
+ loaders updatePluginManagement PluginManagement.extractOverrides(unit.plugins.fullClasspath)
+
def addResolvers(unit: BuildUnit, isRoot: Boolean, loaders: BuildLoader): BuildLoader =
unit.definitions.builds.flatMap(_.buildLoaders) match
{
@@ -468,7 +466,9 @@ object Load
def pluginDefinitionLoader(config: LoadBuildConfiguration, pluginClasspath: Seq[Attributed[File]]): (Seq[Attributed[File]], ClassLoader) =
{
val definitionClasspath = if(pluginClasspath.isEmpty) config.classpath else (pluginClasspath ++ config.classpath).distinct
- val pluginLoader = if(pluginClasspath.isEmpty) config.loader else ClasspathUtilities.toLoader(data(pluginClasspath), config.loader)
+ val pm = config.pluginManagement
+ def addToLoader() = pm.loader add Path.toURLs(data(pluginClasspath))
+ val pluginLoader = if(pluginClasspath.isEmpty) pm.initialLoader else { addToLoader(); pm.loader }
(definitionClasspath, pluginLoader)
}
def buildPluginDefinition(dir: File, s: State, config: LoadBuildConfiguration): Seq[Attributed[File]] =
View
16 main/PluginManagement.scala
@@ -2,17 +2,20 @@ package sbt
import Keys.Classpath
import Project.Setting
+ import PluginManagement._
-final case class PluginManagement(overrides: Set[ModuleID], applyOverrides: Set[ModuleID], loader: ClassLoader, initialLoader: ClassLoader)
+ import java.net.{URL,URLClassLoader}
+
+final case class PluginManagement(overrides: Set[ModuleID], applyOverrides: Set[ModuleID], loader: PluginClassLoader, initialLoader: ClassLoader)
{
def shift: PluginManagement =
- PluginManagement(Set.empty, overrides, initialLoader, initialLoader)
+ PluginManagement(Set.empty, overrides, new PluginClassLoader(initialLoader), initialLoader)
def addOverrides(os: Set[ModuleID]): PluginManagement =
copy(overrides = overrides ++ os)
def addOverrides(cp: Classpath): PluginManagement =
- addOverrides(PluginManagement extractOverrides cp)
+ addOverrides(extractOverrides(cp))
def inject: Seq[Setting[_]] = Seq(
Keys.dependencyOverrides ++= overrides
@@ -20,11 +23,16 @@ final case class PluginManagement(overrides: Set[ModuleID], applyOverrides: Set[
}
object PluginManagement
{
- def apply(initialLoader: ClassLoader): PluginManagement = PluginManagement(Set.empty, Set.empty, initialLoader, initialLoader)
+ def apply(initialLoader: ClassLoader): PluginManagement =
+ PluginManagement(Set.empty, Set.empty, new PluginClassLoader(initialLoader), initialLoader)
def extractOverrides(classpath: Classpath): Set[ModuleID] =
classpath flatMap { _.metadata get Keys.moduleID.key map keepOverrideInfo } toSet;
def keepOverrideInfo(m: ModuleID): ModuleID =
ModuleID(m.organization, m.name, m.revision, crossVersion = m.crossVersion)
+
+ final class PluginClassLoader(p: ClassLoader) extends URLClassLoader(Array(), p) {
+ def add(urls: Seq[URL]): Unit = synchronized { urls foreach addURL }
+ }
}
Please sign in to comment.
Something went wrong with that request. Please try again.