关于 scala:我如何让 sbt 将我的代码依赖的所有 jar 文件收集到一个地方?

how do I get sbt to gather all the jar files my code depends on into one place?

我是 sbt 的新手。我希望它把所有的依赖 jar 文件以及我的 jar 文件放在一个地方。 SBT 将运行该应用程序,但我分散了各种依赖项,还有一个 .ivy 文件夹,里面装满了我的 jar 文件间接依赖的东西。

那么有没有一个简单的命令可以将它们全部复制到一个地方,以便我可以将其分发到另一台机器上?


您可以使用许多插件:sbt-assembly、sbt-proguard、sbt-onejar、xitrum-package 等。

查看 SBT 插件列表。


将以下行添加到您的 build.sbt 文件中。

1
retrieveManaged := true

这将在本地收集依赖项


在您的构建文件中创建一个任务,如下所示:

1
2
3
4
5
6
7
8
9
10
lazy val copyDependencies = TaskKey[Unit]("pack")

def copyDepTask = copyDependencies <<= (update, crossTarget, scalaVersion) map {
  (updateReport, out, scalaVer) =>
    updateReport.allFiles foreach {
      srcPath =>
        val destPath = out /"lib" / srcPath.getName
        IO.copyFile(srcPath, destPath, preserveLastModified = true)
    }
}

像这样将任务添加到项目中:

1
2
3
4
5
6
7
8
lazy val HubSensors =
  Project("HubSensors", file("HubSensors"), settings = shared ++ Seq(
    copyDepTask,
    resolvers ++= Seq(novusRels),
    libraryDependencies ++= Seq(
      jodatime
    )
  )) dependsOn(HubCameraVision, JamServiceProxy, HubDAL)

在 SBT 控制台中输入:

1
2
project [Project Name]
pack


试试 sbt-pack 插件 https://github.com/xerial/sbt-pack,它会收集 target/pack 文件夹中所有依赖的 jars 并生成启动脚本。


你也可以试试 SBT Native Packager:https://github.com/sbt/sbt-native-packager (sbt 0.7)

这仍然是一个 WIP,但将在未来几周内用于 Play Framework 2.2。
使用它,您可以创建独立的 ZIP 文件、Debian 包 (DEB)、Windows 安装包 (MSI)、DMG、RPM 等。


SBT 文档有一个"One Jar Plugins"列表:

  • sbt-assembly: https://github.com/sbt/sbt-assembly
  • xsbt-proguard-plugin: https://github.com/adamw/xsbt-proguard-plugin
  • sbt-deploy: https://github.com/reaktor/sbt-deploy
  • sbt-appbundle (os x standalone): https://github.com/sbt/sbt-appbundle
  • sbt-onejar (Packages your project using One-JAR?): https://github.com/sbt/sbt-onejar

愿你寻找这个 sbt 插件:https://github.com/anvie/sbt-onedir-plugin