Как добавить «предоставленные» зависимости обратно в путь classа run / test tasks?

Вот пример 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" )): _*) 

objective состоит в том, чтобы иметь искровое kernel "provided" чтобы оно и его зависимости не включались в артефакт сборки, а чтобы повторно включать их в путь к среде выполнения для задач, связанных с run и test .

Похоже, что использование настраиваемой области в конечном итоге будет полезно, но я зациклен на том, как фактически заставить задачи по умолчанию / глобальному запуску / тестированию использовать пользовательские libraryDependencies и, надеюсь, переопределить значение по умолчанию. Я пробовал вещи, в том числе:

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

и тому подобное безрезультатно.

Подводя итог: это, по сути, является обобщением веб-случая, где servlet-api находится в «предоставленной» области, а задачи запуска / тестирования обычно вызывают контейнер сервлетов, который действительно обеспечивает сервлет-api для выполняемого кода. Единственное различие здесь в том, что я не откатываю отдельную JVM / среду; Я просто хочу вручную увеличить пути к classам этих задач, эффективно «отменив» предоставленную область, но таким образом, чтобы продолжать исключать зависимость от артефакта сборки.

Для аналогичного случая я использовал в assembly.sbt:

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

и теперь задача «запустить» использует все библиотеки, в том числе те, которые отмечены «предоставлены». Никаких дальнейших изменений не было.

Добавляя к ответу @douglaz,

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

является соответствующим исправлением для задачи runMain.

Если вы используете sbt-revolver , вот решение для его задачи «reStart»:

fullClasspath in Revolver.reStart <<= fullClasspath in Compile

UPD: для sbt-1.0 вы можете использовать новую форму назначения:

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

  • Какова мотивация присвоения Scala для оценки Unit вместо присвоенного значения?
  • Как ссылаться на внешний проект sbt из другого sbt-проекта?
  • Как векторизовать столбцы DataFrame для алгоритмов ML?
  • Scala: карта слияния
  • Преобразовать java.util.HashMap в scala.collection.immutable.Map в java
  • Список волшебных функций Scala
  • Создание classа из строки и создание экземпляра в Scala 2.10
  • Два способа определения функций в Scala. В чем разница?
  • Как передать дополнительные параметры UDF в SparkSql?
  • Как определить пользовательский разделитель для Spark RDD с одинаковым размером раздела, где каждый раздел имеет одинаковое количество элементов?
  • распаковка scala tuple
  • Давайте будем гением компьютера.