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 assemblyed 时继承,对吗? 尽管我不熟悉 sbt-assembly,但这是我所期望的事件。您可能可以测试并确认。

以上是关于SBT 程序集从另一个 JAR 中删除类的主要内容,如果未能解决你的问题,请参考以下文章

Scala sbt 程序集 jar 不起作用(未找到类实现)但通过 IntelliJ 时代码可以工作 [关闭]

如何从 sbt 的包中排除程序集?

OutofMemoryError 使用 sbt 程序集创建胖 jar

如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?

SBT:如何创建实用程序 jar 作为构建后步骤以将所有依赖 jar 包含在类路径中

如何通过排除集成测试来运行 sbt 程序集