【问题标题】:how do I get sbt to gather all the jar files my code depends on into one place?如何让 sbt 将我的代码依赖的所有 jar 文件收集到一个地方?
【发布时间】:2011-12-20 05:30:21
【问题描述】:

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

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

【问题讨论】:

  • 是的,这是真正的痛苦。也许我错过了什么,但我真的不明白为什么这不是 Simple Build Tool 的一部分
  • @AlexPovar:我想有很多方法可以做到这一点,因此选择一种并将其标准化可能是有害的(但我同意方便)。

标签: sbt scala jar sbt


【解决方案1】:

您可以使用许多插件:sbt-assemblysbt-proguardsbt-onejarxitrum-package 等。

请参阅list of SBT plugins

【讨论】:

  • 有什么区别?
【解决方案2】:

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

retrieveManaged := true

这将在本地收集依赖项

【讨论】:

  • 感谢您的提示。你是怎么知道的——是否有 sbt 0.13.13 文档的链接(我没有找到)。它有效 - sbt compilelib_unmanaged/ 下收集依赖项。
  • 非常感谢,我喜欢这种方法,不想配置差异插件。但是,如果有解决方案,retrieveManaged 似乎不会获得由 maven 管理的 java 库的依赖项?
  • 不适用于 sbt 1.30 github.com/sbt/sbt/issues/5078 如果您真的想使用此功能,请降级您的 sbt
【解决方案3】:

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

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)
    }
}

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

lazy val HubSensors =
  Project("HubSensors", file("HubSensors"), settings = shared ++ Seq(
    copyDepTask,
    resolvers ++= Seq(novusRels),
    libraryDependencies ++= Seq(
      jodatime
    )
  )) dependsOn(HubCameraVision, JamServiceProxy, HubDAL)

在 SBT 控制台中输入:

project [Project Name]
pack

【讨论】:

  • 我发现这种方法有两个困难,特别是在大型项目中: 1. 在多个相互依赖的项目上运行 update 最终会多次复制同一个 .jar; 2. 您可能具有相同的依赖项,但复制了不同的版本。这通常发生在流行的库中,比如 log4j 和 apache-commons,因为同一个工件被多个依赖项传递引用。有关详细信息,请参阅任务 evicted。您可以执行类似(伪代码)“allFiles - evicted”之类的操作,但这绝非易事。您必须深入了解 SBT API。
  • 但是,对于小型项目,您的方法会非常好。
【解决方案4】:

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

【讨论】:

  • 我刚刚从 sbt-onejar 迁移到 sbt-pack,我不得不说它非常好:快速、易于使用且可靠。
【解决方案5】:

你也可以试试 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-native-packager 后,可以通过 sbt stage 获取 target/universal/stage 中的文件
【解决方案6】:

SBT 文档有一个list of "One Jar Plugins"

【讨论】:

    【解决方案7】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-13
      • 2015-09-28
      • 1970-01-01
      • 2014-10-28
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      相关资源
      最近更新 更多