nul*_*ull 6 scala sbt sbt-assembly apache-spark
我们在scala应用程序中经常使用spark。如果我在本地测试,我的库依赖项是:
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1",
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.1" ,
Run Code Online (Sandbox Code Playgroud)
而我正在构建要使用的jar来部署:
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided",
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.1" % "provided",
Run Code Online (Sandbox Code Playgroud)
由于工作的性质,我们有时可能不得不在尝试不同的事情时来回翻转几次。不可避免的是,我有时会忘记更改构建文件并浪费时间,这不是很多时间,但足以促使我提出这个问题。
因此,是否有人知道让构建文件根据触发器更新提供的值的方式(除了记住“做对了”)?例如,也许读取测试或实时的配置选项?
提前致谢。
在我的示例中,我刚刚使用两个不同的spark版本执行了动态构建。我需要根据特定条件使用两个不同的版本。
您可以通过两种方式做到这一点。由于您需要以一种或其他方式提供输入,因此您需要使用命令行参数。
1)使用build.sbt它自己。
a)您可以定义一个名称为“ sparkVersion”的参数
b)在build.sbt中读取该参数(您可以在build.sbt中编写scala代码,并在构建时以任何方式将其编译为scala。)
c)执行如下基于条件的依赖关系。
val sparkVersion = Option(System.getProperty("sparkVersion")).getOrElse("default")
if(sparkVersion == "newer"){
println(" newer one");
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0"
}else{
println(" default one");
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" % "provided"
}
Run Code Online (Sandbox Code Playgroud)
您可以随意使用所有构建选项。
2)使用build.scala文件。您可以在/project/build.scala中创建一个build.scala文件。
您可以编写以下代码。
import sbt._
import Keys._
object MyBuild extends Build {
val myOptionValue = Option(System.getProperty("scalaTestVersion")).getOrElse("defaultValue")
val depVersion = if(myOptionValue == "newer"){
println(" asked for newer version" );
"2.2.6"
}else{
println(" asked for older/default version" );
"2.2.0"
}
val dependencies = Seq(
"org.scalatest" %% "scalatest" % depVersion % "test"
)
lazy val exampleProject = Project("SbtExample", file(".")).settings(
version := "1.2",
scalaVersion := "2.10.4",
libraryDependencies ++= dependencies
)
}
Run Code Online (Sandbox Code Playgroud)
之后,只需运行如下的build命令。
sbt clean编译-DsparkVersion = newer -DscalaTestVersion = newer
我都给出了构建命令。您可以选择任一,并且仅提供一个选项。如果您需要任何帮助,请给我写信。
要解决构建中的重复项,您可以在build.sbt中添加以下内容
mergeStrategy in assembly := {
case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard
case m if m.toLowerCase.matches("meta-inf.*\\.sf$") => MergeStrategy.discard
case "log4j.properties" => MergeStrategy.discard
case "log4j-defaults.properties" => MergeStrategy.discard
case m if m.toLowerCase.startsWith("meta-inf/services/") => MergeStrategy.filterDistinctLines
case "reference.conf" => MergeStrategy.concat
case _ => MergeStrategy.first
}
Run Code Online (Sandbox Code Playgroud)
您将了解到此功能多么神奇和神奇。
| 归档时间: |
|
| 查看次数: |
731 次 |
| 最近记录: |