【问题标题】:sbt-assembly: how to link dependencies jar with main jar?sbt-assembly:如何将依赖项 jar 与主 jar 链接?
【发布时间】:2013-07-25 21:26:27
【问题描述】:

我在 scala 中编码并使用带有sbt-assembly 插件的 SBT。我的项目有很多外部库,因此 sbt-assembly 需要很长时间来打包 JAR 文件。我想为我的代码和依赖项创建一个单独的 jar 文件。因此,我可以简单地重新编译和重新打包我的代码。如何做到这一点?

目前的进展:

build.sbt 中的以下命令可防止 sbt-assembly 打包库:

assembleArtifact in packageScala := false

assembleArtifact in packageDependency := false

然后可以通过传递以下命令来构建单独的 jar:assemblyassembly-package-scalaassembly-package-dependency。他们制作了三个罐子:一个包含我的程序,一个包含 scala 库,一个包含所有依赖项。

但是,jar 文件不再可执行,因为它在单独的 jar 文件中看不到依赖项。我想我需要为 assembly-sbt 添加一个类路径,但我不知道该怎么做。

【问题讨论】:

    标签: scala sbt sbt-assembly


    【解决方案1】:

    Setting Classpath Still Can't Find External Jar。甲骨文说:

    使用此选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。

    所以,你不得不说:

    java -cp "foo-assembly-0.1-deps.jar:foo-assembly-0.1.jar" Main
    

    其中Main 是主类的名称,: 是您操作系统上的文件分隔符(; 在 Windows 上)。

    目前assembly-package-scala 中似乎有一个错误并且它是空的,但这应该没关系,因为assembly-package-dependency 也包含 Scala 库。

    【讨论】:

    • 有效!而且速度很快:时间从大约 40 秒减少到几秒。技术说明:我还需要包含scala-library-2.10.2-assembly.jar,否则 scala repl 不稳定。我可以用 sbt 0.12.4 和 sbt-assembly 0.9.0 编译它。
    • 有没有办法把这个类引用打包到主jar文件中?所以可以通过点击来执行jar。
    • sbt-onejar 可以制作一个包含其他 jar 的 jar,并且打包速度更快。但我听说 sbt-assembly 启动得更快,因为大概 sbt-onejar'ed jar 需要即时解压缩。 sbt-assembly 0.9.0 缓存库解压缩,因此您不必将它们拆分。
    【解决方案2】:

    https://github.com/xerial/sbt-pack 使用 sbt-pack 插件。到目前为止,我发现它是打包项目和依赖项的最干净的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-29
      • 2021-12-27
      • 2011-12-25
      • 2018-06-13
      • 2019-08-08
      • 2016-05-18
      • 2018-11-28
      • 2019-05-22
      相关资源
      最近更新 更多