以下是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"
)): _*)
目标是让spark-core "provided"
因此它及其依赖项不包含在程序集工件中,而是将它们重新包含在run
的运行时类路径中 - 和{{1}相关的任务。
似乎使用自定义作用域最终会有所帮助,但我对如何实际导致默认/全局运行/测试任务使用自定义test
并希望覆盖默认值感到困惑。我尝试过的东西包括:
libraryDependencies
等无济于事。
总结一下:这基本上是Web案例的一般化,其中servlet-api处于“提供”范围,而运行/测试任务通常派生一个servlet容器,该容器确实为运行的代码提供了servlet-api。 。这里唯一的区别是我没有分离出一个单独的JVM /环境;我只是想手动增加这些任务的类路径,有效地“撤消”“提供”范围,但是继续从组件工件中排除依赖关系。
答案 0 :(得分:47)
对于我在assembly.sbt中使用的类似情况:
run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
现在'run'任务使用所有库,包括标记为“provided”的库。不需要进一步的改变。
更新
@rob解决方案似乎是唯一一个使用最新SBT版本的解决方案,只需添加到settings
中的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
答案 1 :(得分:14)
添加@douglaz'回答,
runMain in Compile <<= Defaults.runMainTask(fullClasspath in Compile, runner in (Compile, run))
是runMain任务的相应修复。
答案 2 :(得分:2)
如果你使用sbt-revolver
插件,这里有一个“reStart”任务的解决方案:
fullClasspath in Revolver.reStart <<= fullClasspath in Compile
UPD:对于sbt-1.0,您可以使用新的分配表:
fullClasspath in Revolver.reStart := (fullClasspath in Compile).value
答案 3 :(得分:0)
另一个选择是为组装与运行/测试创建单独的sbt项目。这样,您就可以运行sbt asseblyProj/assembly
来构建一个胖子罐,以便通过spark-submit进行部署,还可以运行sbt runTestProj/run
来通过sbt直接运行并嵌入Spark。作为额外的好处,runTestProj无需修改即可在IntelliJ中工作,并且可以为每个项目定义一个单独的主类,例如使用sbt运行时,在代码中指定spark master。
val sparkDep = "org.apache.spark" %% "spark-core" % sparkVersion
val commonSettings = Seq(
name := "Project",
libraryDependencies ++= Seq(...) // Common deps
)
// Project for running via spark-submit
lazy val assemblyProj = (project in file("proj-dir"))
.settings(
commonSettings,
assembly / mainClass := Some("com.example.Main"),
libraryDependencies += sparkDep % "provided"
)
// Project for running via sbt with embedded spark
lazy val runTestProj = (project in file("proj-dir"))
.settings(
// Projects' target dirs can't overlap
target := target.value.toPath.resolveSibling("target-runtest").toFile,
commonSettings,
// If separate main file needed, e.g. for specifying spark master in code
Compile / run / mainClass := Some("com.example.RunMain"),
libraryDependencies += sparkDep
)