2016-01-14 57 views
1

我有一個JAR列表,我想通過SBT將JAR下載到指定的目標目錄中。有沒有一種方法/命令來做到這一點?Sbt下載指定的罐子列表

我正在嘗試的是在類路徑中爲諸如spark之類的外部系統創建一個jars列表。 默認情況下,spark將一些jar添加到classpath中,並且我還有一些jar,除了spark類路徑jar之外,我的app還依賴於這些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相同。

+1

請添加到您的'build.sbt'文件的問題內容。 –

+1

「JAR列表」是什麼意思?可以從maven下載的庫,或者你的服務器上的東西。請舉例說明。 – ymonad

+0

我已經添加了我的build.sbt並解釋了我的問題。 – Knight71

回答

0

添加sbt-packproject/plugins.sbt(或創建):

addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.7.9") 

添加packAutoSettingsbuild.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文件。

+0

這不是我想要的。我只需要在build.sbt中指定的幾個罐子。以上將下載所有的罐子。 – Knight71

+0

我認爲解決方案是運行'sbt-pack'。它將所有jar文件下載到'target/pack/lib'。然後從這個目錄複製只提到的文件(或刪除其他文件)(使用'new java.io,File(「target/pack/lib」)。listFiles.filter' then sbt.IO.copy - http://www.scala -sbt.org/0.13.7/api/index.html#sbt.IO$)。 –