我有一个JAR列表,我想通过SBT将JAR下载到指定的目标目录中。有没有办法/命令来做到这一点?
我正在尝试的是在类路径中为spark等外部系统提供一个jar列表。 默认情况下,spark会将一些jar添加到classpath和 除了spark classpath jar之外,我还有一些我的应用依赖的罐子。
我不想制造一个胖罐子。 我需要将依赖的罐子和我的罐子一起装在一个焦油球中。
我的build.sbt
name := "app-jar"
scalaVersion := "2.10.5"
dependencyOverrides += "org.scala-lang" % "scala-library" % scalaVersion.value
scalacOptions ++= Seq("-unchecked", "-deprecation")
libraryDependencies += "org.apache.spark" %% "spark-streaming" % "1.4.1"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.1"
libraryDependencies += "org.apache.spark" %% "spark-streaming-kafka" % "1.4.1"
// I want these jars from here
libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "1.4.0-M3"
libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector-java" % "1.4.0-M3"
libraryDependencies += "com.google.protobuf" % "protobuf-java" % "2.6.1"
...
// To here in my tar ball
到目前为止,我已经使用shell脚本实现了这一目标。
我想知道是否有办法对sbt做同样的事。
答案 0 :(得分:0)
将sbt-pack添加到project/plugins.sbt
(或创建):
addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.7.9")
将packAutoSettings
添加到build.sbt
,然后运行:
sbt pack
在target/pack/lib
中,你会找到所有的罐子(带有依赖关系)。
<强>更新强>
向sbt添加新任务:
val libraries = Seq(
"com.datastax.spark" %% "spark-cassandra-connector" % "1.4.0-M3",
"com.datastax.spark" %% "spark-cassandra-connector-java" % "1.4.0-M3",
"com.google.protobuf" % "protobuf-java" % "2.6.1"
)
libraryDependencies ++= libraries
lazy val removeNotNeeded = taskKey[Unit]("Remove not needed jars")
removeNotNeeded := {
val fileSet = libraries.map(l => s"${l.name}-${l.revision}.jar").toSet
println(s"$fileSet")
val ver = scalaVersion.value.split("\\.").take(2).mkString(".")
println(s"$ver")
file("target/pack/lib").listFiles.foreach{
file =>
val without = file.getName.replace(s"_$ver","")
println(s"$without")
if(!fileSet.contains(without)){
println(s"${file.getName} removed")
sbt.IO.delete(file)
}
}
}
致电sbt pack
致电sbt removeNotNeeded
后。您只会收到所需的jar文件。