test case demonstrating two ways of augmenting sbt's classpath. addExtra1 is the recommended way

This commit is contained in:
Mark Harrah 2011-07-02 23:01:01 -04:00
parent 5f8a73cc21
commit 37cedcca5f
2 changed files with 55 additions and 0 deletions

View File

@ -0,0 +1,45 @@
import sbt._
import Keys._
object B extends Build
{
lazy val root = Project("root", file(".")) settings(
autoScalaLibrary := false,
libraryDependencies += "log4j" % "log4j" % "1.2.16",
retrieveManaged := true,
commands ++= Seq(
addExtra("add1", addExtra1),
addExtra("add2", addExtra2),
checkExtra
)
)
def addExtra(name: String, f: (State, Seq[File]) => State) = Command.command(name) { s =>
f(s, (file("lib_managed") ** "*.jar").get)
}
def checkExtra = Command.command("check") { s =>
val loader = Class.forName("org.apache.log4j.Level").getClassLoader
val sbtLoader = classOf[sbt.Build].getClassLoader
assert(loader eq sbtLoader, "Different loader for sbt and extra: " + sbtLoader + " and " + loader)
s
}
def addExtra1(s: State, extra: Seq[File]): State =
{
val cs = s.configuration.provider.components()
val copied = cs.addToComponent("extra", extra.toArray)
if(copied) s.reload else s
}
def addExtra2(s: State, extra: Seq[File]): State =
{
val reload = State.defaultReload(s)
val currentID = reload.app
val currentExtra = currentID.classpathExtra
val newExtra = (currentExtra ++ extra).distinct
if(newExtra.length == currentExtra.length)
s
else
{
val newID = ApplicationID(currentID).copy(extra = extra)
s.setResult(Some(reload.copy(app = newID)))
}
}
}

View File

@ -0,0 +1,10 @@
-> check
> update
> add1
> check
> reboot full
-> check
> add2
> check