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 { |
像这样将任务添加到项目中:
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/