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

如何让sbt将我的代码所依赖的所有jar文件收集到一个地方?,sbt,scala,jar,Sbt,Scala,Jar,我是新来的。我希望它将所有依赖项jar文件以及我的jar文件放在一个地方。SBT将运行这个应用程序,但我有各种各样的依赖项,还有一个.ivy文件夹,里面装满了我的jar文件间接依赖的东西 有没有一个简单的命令可以将它们复制到一个地方,这样我就可以将它们分发到另一台机器上?有很多插件可以使用:,,等等 请参阅。在生成文件中创建任务,如下所示: lazy val copyDependencies = TaskKey[Unit]("pack") def copyDepTask = copyDepen

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


有没有一个简单的命令可以将它们复制到一个地方,这样我就可以将它们分发到另一台机器上?

有很多插件可以使用:,,等等


请参阅。

在生成文件中创建任务,如下所示:

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)
project [Project Name]
pack
在SBT控制台类型中:

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)
project [Project Name]
pack
SBT文件具有以下功能:

  • sbt组件:
  • xsbt proguard插件:
  • sbt部署:
  • sbt appbundle(os x单机版):
  • SBTONEJAR(使用一个JAR打包您的项目™):

尝试sbt pack plugin,它收集目标/pack文件夹中的所有相关JAR,并生成启动脚本。

您也可以尝试sbt Native Packager:(sbt 0.7+)

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

您可以寻找这个sbt插件:

build.sbt
文件中添加以下行

retrieveManaged := true

这将在本地收集依赖项

是的,这真的很痛苦。也许我错过了一些东西,但我真的不明白为什么这不是简单构建的一部分Tool@AlexPovar:我想有很多方法可以做到这一点,因此选择一种方法并将其标准化可能是有害的(但我同意这一点).我刚刚从sbt onejar迁移到sbt pack,我不得不说它非常好:快速、易于使用且可靠。我发现这种方法有两个困难,尤其是在大型项目中:1.在多个相互依赖的项目上运行更新,最终会多次复制相同的.jar;2.您可能具有相同的依赖关系,但具有不同的v正在复制版本。这通常发生在流行的库中,如log4j和apache commons,因为同一工件被多个依赖项传递引用。有关详细信息,请参阅任务
executed
。您可以执行(伪代码)“allFiles-executed”之类的操作,但这绝非小事。您必须深入研究SBT API。但是,对于小型项目,您的方法将非常好。为了进一步提供帮助,在安装了SBT native packager之后,您可以使用
SBT stage
target/universal/stage
中获取文件,感谢您的提示。您是如何知道这一点的指向sbt 0.13.13文档的链接(我没有找到)它工作-
sbt compile
lib_unmanaged/
下收集依赖项。非常感谢中提到,我喜欢这种方法,不想为差异插件配置。但是,看起来retrieveManaged不会获得maven管理的依赖于java库,如果有解决方案的话?对sbt 1.30降级不起作用如果您真的想使用此功能,您的sbt有什么区别?