SBT 程序集从另一个 JAR 中删除类
Posted
技术标签:
【中文标题】SBT 程序集从另一个 JAR 中删除类【英文标题】:SBT Assembly remove classes from another JAR 【发布时间】:2021-10-08 01:35:21 【问题描述】:这是我的 repo 的包结构:
src
|-- main
|-- scala
|-- me.sparker0i.spark
|-- runner
|-- Runner.scala
|-- utils
|-- Constants.scala
|-- DatabaseUtils.scala
|-- service
|-- Service.scala
|-- Transform.scala [extends Service]
|-- Fetch.scala [extends Service]
|-- <32 more>
|-- Test.scala
我想将此应用程序拆分为两个,这样一个应用程序仍然是核心,而另一个使用核心 jar 作为libraryDependencies
:
核心回购结构:
src
|-- main
|-- scala
|-- me.sparker0i.spark
|-- runner
|-- Runner.scala
|-- utils
|-- Constants.scala
|-- DatabaseUtils.scala
|-- service
|-- Service.scala
|-- Test.scala
独立回购:
src
|-- main
|-- scala
|-- me.sparker0i.spark
|-- service
|-- Transform.scala [extends Service from Core Repo JAR]
|-- Fetch.scala [extends Service from Core Repo JAR]
|-- <32 more>
现在在独立存储库中,我在 libraryDependencies
中引用了核心存储库 JAR。 我需要 Core JAR 来在我们的 Jenkins CICD 中运行独立存储库的测试用例,但在我需要打包独立存储库时不需要。
当我sbt assembly
时,我如何确保我没有在独立JAR中获取核心JAR的内容?原因是我将在 Core JAR 中运行 Main 类,但也将提供 Independent JAR 作为类路径。
有没有什么方法可以使用 sbt 实现上述要求?
【问题讨论】:
【参考方案1】:您可以使用范围Provided
声明依赖项。这完全适用于这个用例,即在运行时以某种方式提供依赖项,但不是包的一部分。
groupId % core % version % Provided
【讨论】:
如果我的理解是正确的,那么核心 JAR 中的任何其他依赖项都不会在这个独立 JAR 被sbt assembly
ed 时继承,对吗?
尽管我不熟悉 sbt-assembly,但这是我所期望的事件。您可能可以测试并确认。以上是关于SBT 程序集从另一个 JAR 中删除类的主要内容,如果未能解决你的问题,请参考以下文章
Scala sbt 程序集 jar 不起作用(未找到类实现)但通过 IntelliJ 时代码可以工作 [关闭]
OutofMemoryError 使用 sbt 程序集创建胖 jar
如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?