微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在uber jar中而不是单个子模块jar中构建sbt项目

如何解决在uber jar中而不是单个子模块jar中构建sbt项目

最近,Been试图改变我的Scala项目进行装配的方式,以便仅从其中生成一个jar,而不是每个模块都生成一个

main-project
| - inner-module-one [inner_module_one]
| - inner-module-two [inner_module_two]

我目前对主要模块的操作如下(我希望它的uber jar包含其他模块内容)。

project
  .in(file("."))
  .settings(
    name := "main-project",assemblyName,settings
  )
  .aggregate(
    inner_module_one,inner_module_two
  )

另外两个模块声明如下。

lazy val inner_module_one = project
  .in(file("inner-module-one"))
  .settings(
    name := "inner-module-one",settings,dependencies and such (...)
  )
  .dependsOn(
    inner_module_two
  )

main-project生成的jar文件非常小(大小不超过5mbs),并且仅包含与Scala相关的内容,而没有任何项目类。但是,其他模块罐是完整的,并且包含它们所需的一切。

我已经尝试将以下设置添加main-project

aggregate in assembly := false

但到目前为止,仍然没有运气。不会生成子模块的jar,但是main-project jar仍然不包含子模块的内容

任何线索可能出在哪里?

编辑

尝试了@LuisMiguelMejíaSuárez的建议,似乎想要构建,但是,出现了一些错误,这些错误已在其各自的模块中解决。在给定的模块中,由于有一些覆盖而解决了一些冲突,但是现在它们又出现了。

[error] deduplicate: different file contents found in the following:

使用dependsOn而不是aggregate是否会影响依赖项的添加,覆盖等方式?

解决方法

让我们将您的问题分为两部分,如何将子模块包含到main-project中,并且您想知道如何不打包两个子模块。

让我们从简单的第二个开始。 sbt-assembly是sbt的插件。与其他任何插件一样,您无法使用disablePlugins命令将其禁用。因此,如果您定义:

lazy val inner_module_one = project.disablePlugins(AssemblyPlugin)
  .in(file("inner-module-one"))
  .settings(
    name := "inner-module-one"
)
.dependsOn(
  inner_module_two
)

然后inner_module_one不会建立一个jar。

要解决第一个问题,我们需要了解aggregation和dependsOn之间的区别。为此,我引用Jacek Laskowski great explanation

aggregate导致任务在聚合模块中执行,并且所有任务都被聚合,而dependsOn设置了CLASSPATH依赖关系,因此库对聚合模块可见(取决于示例中的默认编译配置)。

因此,当您汇总inner_module_oneinner_module_two时,您也将随后进行汇编。为了使它们成为main-project的一部分,您需要做的只是声明:

project
  .in(file("."))
  .settings(
    name := "main-project",assemblyName,settings
  )
  .dependsOn(
    inner_module_one,inner_module_two
  )

为了对其进行测试,我创建了以下结构:

main-project
|-inner_module_one
 |-main
  |-scala
   |One.scala
|-inner_module_two
 |-main
  |-scala
   |Two.scala

为了检查类One是否在罐子中,我使用了以下命令:

jar tfv inner-module-one/target/scala-2.12/inner-module-one-assembly-0.1.0-SNAPSHOT.jar | grep One 

然后,当使用原始sbt assembly运行aggregate时,以上命令在输出jar上提供了空结果。当将sbt assemblydependsOn一起运行时,上面的命令提供了一个结果:

480 Fri Oct 09 01:48:14 IDT 2020 One.class

如果这引起冲突,则可以在sbt-assembly: deduplication found error

上进行阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。