Come aggiungere le dipendenze “fornite” per eseguire il classpath delle attività / test?

Ecco un esempio di build.sbt :

 import AssemblyKeys._ assemblySettings buildInfoSettings net.virtualvoid.sbt.graph.Plugin.graphSettings name := "scala-app-template" version := "0.1" scalaVersion := "2.9.3" val FunnyRuntime = config("funnyruntime") extend(Compile) libraryDependencies += "org.spark-project" %% "spark-core" % "0.7.3" % "provided" sourceGenerators in Compile <+= buildInfo buildInfoPackage := "com.psnively" buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, target) assembleArtifact in packageScala := false val root = project.in(file(".")). configs(FunnyRuntime). settings(inConfig(FunnyRuntime)(Classpaths.configSettings ++ baseAssemblySettings ++ Seq( libraryDependencies += "org.spark-project" %% "spark-core" % "0.7.3" % "funnyruntime" )): _*) 

L’objective è quello di avere "provided" spark-core in modo che esso e le sue dipendenze non siano inclusi nel manufatto dell’assembly, ma di reinserirli nel percorso di class di runtime per l’ run e test attività correlate al test .

Sembra che l’utilizzo di un ambito personalizzato alla fine sarà utile, ma sono ostacolato su come effettivamente causare le attività di esecuzione / test globali / globali per utilizzare le libraryDependencies personalizzate e, si spera, sovrascrivere il valore predefinito. Ho provato cose, tra cui:

 (run in Global) := (run in FunnyRuntime) 

e simili senza successo.

Riassumendo: si tratta essenzialmente di una generalizzazione del caso web, in cui il servlet-API è in ambito “fornito” e le attività di esecuzione / test in genere eseguono il fork di un servlet container che fornisce realmente il servlet-api al codice in esecuzione. L’unica differenza qui è che non sto biforcando un JVM / ambiente separato; Voglio solo aumentare manualmente i percorsi di class di queste attività, “annullare” effettivamente l’ambito “fornito”, ma in un modo che continua a escludere la dipendenza dalla risorsa di assemblaggio.

Per un caso simile ho usato in assembly.sbt:

 run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run)) 

e ora il task 'run' usa tutte le librerie, comprese quelle contrassegnate con "provided". Nessun ulteriore cambiamento è stato necessario.

Aggiungendo alla risposta di @douglaz,

 runMain in Compile <<= Defaults.runMainTask(fullClasspath in Compile, runner in (Compile, run)) 

è la correzione corrispondente per l'attività runMain.

Se usi il plugin sbt-revolver , ecco una soluzione per il suo compito “reStart”:

fullClasspath in Revolver.reStart <<= fullClasspath in Compile

UPD: per sbt-1.0 puoi usare il nuovo modulo di assegnazione:

fullClasspath in Revolver.reStart := (fullClasspath in Compile).value