【问题标题】:Sbt-assembly: How can i assemble all classes to a single fat jar for projects with dependenceSbt-assembly:我如何将所有类组装到一个单独的 fat jar 用于具有依赖关系的项目
【发布时间】:2017-06-06 22:36:03
【问题描述】:

我正在使用 sbt-assembly 来打包我的 scala 对象,但我不知道如何为一个聚合并依赖于许多其他项目的项目组装一个 fat jar。

例如,我有:

lazy val a = project in file("project-a")
lazy val poj = (project in file("project-poj")).dependsOn(a)
lazy val root = (project in  file(".")).aggregate(a, poj)

sbt 组装后,poj-assembly.jar 和 root-assembly.jar 没有在项目 a 中包含 scala 类。

感谢您的帮助。

【问题讨论】:

    标签: scala sbt sbt-assembly


    【解决方案1】:

    poj-assembly.jar 应该包含项目 a 中的类。如果您发现其他情况,请在 Github 上提供一个完整的示例,因为那将是 sbt-assembly 错误。

    这是我的演示。

    演示

    $ sbt
    > poj/assembly
    [info] Compiling 1 Scala source to /xxx/project-poj/target/scala-2.12/classes...
    [info] Including: scala-library-2.12.1.jar
    [info] Checking every *.class/*.jar file's SHA-1.
    [info] Merging files...
    [warn] Merging 'META-INF/MANIFEST.MF' with strategy 'discard'
    [warn] Strategy 'discard' was applied to a file
    [info] SHA-1: 58a67743530fef8d0713759060c685c536d29591
    [info] Packaging /xxx/project-poj/target/scala-2.12/poj-assembly-0.1.0-SNAPSHOT.jar ...
    [info] Done packaging.
    [success] Total time: 2 s, completed Jan 22, 2017 8:05:29 AM
    > exit
    $ java -jar project-poj/target/scala-2.12/poj-assembly-0.1.0-SNAPSHOT.jar
    A(1)
    

    正如你在上面看到的,它说A(1),这是我在项目a中定义的一个类。以下是构建中的文件。

    project/build.properties

    sbt.version=0.13.13
    

    project/assembly.sbt

    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")
    

    build.sbt

    lazy val root = (project in file("."))
      .aggregate(a, poj)
      .settings(
        organization in ThisBuild := "com.example",
        scalaVersion in ThisBuild := "2.12.1",
        version      in ThisBuild := "0.1.0-SNAPSHOT",
        name := "Hello"
      )
    
    lazy val a = (project in file("project-a"))
    
    lazy val poj = (project in file("project-poj"))
      .dependsOn(a)
    

    project-a/A.scala

    package example
    
    case class A(a: Int)
    

    project-poj/Hello.scala

    package example
    
    object Hello extends App {
      println(example.A(1))
    }
    

    【讨论】:

    • 感谢您的回答,今天我建立了一个新项目,其中包含一些更详细的 assemblyMergeStrategy,我发现 poj-assembly.jar 在项目 a 中包含了 scala 类。我不确定会发生什么,可能是我犯了一些错误。
    • 一个新问题是:我刚刚添加的root-assembly.jar 没有包含其他项目中的类。这是 sbt-assembly 的正确行为吗?我可以将所有类添加到根项目吗?再次感谢你。
    猜你喜欢
    • 2016-10-01
    • 2013-07-25
    • 2019-08-08
    • 2014-10-28
    • 2013-05-09
    • 2020-09-02
    • 2013-09-07
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多