这是一个例子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"
)): _*)
目标是拥有火花核心"provided"
因此它及其依赖项不包含在程序集工件中,而是将它们重新包含在运行时类路径中run
- and test
相关任务。
似乎使用自定义范围最终会有所帮助,但我对如何实际导致默认/全局运行/测试任务使用自定义范围感到困惑libraryDependencies
并希望覆盖默认值。我尝试过的事情包括:
(run in Global) := (run in FunnyRuntime)
之类的都无济于事。
总结一下:这本质上是 Web 案例的概括,其中 servlet-api 处于“提供”范围内,并且运行/测试任务通常分叉一个 servlet 容器,该容器确实为运行的代码提供了 servlet-api。这里唯一的区别是我没有分叉出一个单独的 JVM/环境;我只想手动增强这些任务的类路径,有效地“撤消”“提供的”范围,但以一种继续从程序集工件中排除依赖项的方式。
对于我在 assembly.sbt 中使用的类似情况:
run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
现在“运行”任务使用所有库,包括标有“提供”的库。无需进一步更改。
Update:
@rob 解决方案似乎是唯一适用于最新 SBT 版本的解决方案,只需添加到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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)