关于 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 文件间接依赖的东西。

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

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


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

查看 SBT 插件列表。

  • 有什么区别?


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

1
retrieveManaged := true

这将在本地收集依赖项

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


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

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


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

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


你也可以试试 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 中的文件


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


来源:https://www.codenong.com/7979336/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?