【问题标题】:Sbt to download list of jars specifiedSbt 下载指定的 jar 列表
【发布时间】:2016-01-28 16:32:50
【问题描述】:

我有一个 JAR 列表,我想通过 SBT 将 JAR 下载到指定的目标目录中。有没有办法/命令来做到这一点?

我正在尝试在类路径中为外部系统(如 spark)创建一个 jar 列表。 默认情况下,spark 会在类路径中添加一些 jars 和 除了 spark 类路径 jar 之外,我还有一些我的应用程序依赖的 jar。

我不想做一个胖罐子。 我需要将依赖的 jar 和我的 jar 一起打包到一个 tar 球中。

我的 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 做同样的事情。

【问题讨论】:

  • 请添加到您的build.sbt 文件的问题内容中。
  • “JAR 列表”是什么意思?可以从 maven 下载的库,或者您在服务器中拥有的东西。请举个例子。
  • 我已经添加了我的 build.sbt 并解释了我的问题。

标签: scala sbt


【解决方案1】:

sbt-pack 添加到您的project/plugins.sbt(或创建它):

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

packAutoSettings 添加到您的build.sbt,然后运行:

sbt pack

target/pack/lib 中,您会找到所有 jars(带有依赖项)。

更新

向 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 文件。

【讨论】:

  • 这不是我想要的。我只需要我在 build.sbt 中指定的几个罐子。以上将下载所有jar。
  • 我认为解决方案是运行sbt-pack。它将所有 jar 文件下载到target/pack/lib。然后从此目录中仅复制提到的文件(或删除其他文件)(使用new java.io,File("target/pack/lib").listFiles.filter 然后使用 sbt.IO.copy - scala-sbt.org/0.13.7/api/index.html#sbt.IO$)。
猜你喜欢
  • 2017-03-31
  • 1970-01-01
  • 2019-01-13
  • 2019-05-22
  • 2017-01-29
  • 1970-01-01
  • 2016-12-27
  • 2016-03-05
  • 1970-01-01
相关资源
最近更新 更多