Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add "provided" dependencies back to run/test tasks' classpath?

Here's an example 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"   )): _*) 

The goal is to have spark-core "provided" so it and its dependencies are not included in the assembly artifact, but to reinclude them on the runtime classpath for the run- and test-related tasks.

It seems that using a custom scope will ultimately be helpful, but I'm stymied on how to actually cause the default/global run/test tasks to use the custom libraryDependencies and hopefully override the default. I've tried things including:

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

and the like to no avail.

To summarize: this feels essentially a generalization of the web case, where the servlet-api is in "provided" scope, and run/test tasks generally fork a servlet container that really does provide the servlet-api to the running code. The only difference here is that I'm not forking off a separate JVM/environment; I just want to manually augment those tasks' classpaths, effectively "undoing" the "provided" scope, but in a way that continues to exclude the dependency from the assembly artifact.

like image 469
user2785627 Avatar asked Sep 16 '13 23:09

user2785627


2 Answers

For a similar case I used in assembly.sbt:

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

and now the 'run' task uses all the libraries, including the ones marked with "provided". No further change was necessary.

Update:

@rob solution seems to be the only one working on latest SBT version, just add to settings in build.sbt:

run in Compile := Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run)).evaluated, runMain in Compile := Defaults.runMainTask(fullClasspath in Compile, runner in(Compile, run)).evaluated 
like image 156
douglaz Avatar answered Oct 02 '22 13:10

douglaz


Adding to @douglaz' answer,

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

is the corresponding fix for the runMain task.

like image 24
tgpfeiffer Avatar answered Oct 02 '22 12:10

tgpfeiffer