如何解决在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_one
和inner_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 assembly
与dependsOn
一起运行时,上面的命令提供了一个结果:
480 Fri Oct 09 01:48:14 IDT 2020 One.class
如果这引起冲突,则可以在sbt-assembly: deduplication found error
上进行阅读。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。