【问题标题】:excluding from Uber (fat) jar in sbt for Play! in Scala不包括 sbt for Play 中的 Uber (fat) jar!在斯卡拉
【发布时间】:2016-10-12 11:00:08
【问题描述】:

我有一个项目,我必须为某些专有硬件包含一个 fat-jar - 不要问,我知道 jar 最好放在 Central 或其他一些 repo 上,但事实并非如此。 :( 我必须将它放在 lib 目录中,以便 sbt 将其视为非托管依赖项。

但 jar 包含 slf4j,它的旧版本,并且当 Play!运行它会抛出一个错误,抱怨缺少静态函数(这是在较新版本的 slf4j 中添加的。

这是我尝试过的。

  • 我尝试使用 force() 添加 libraryDependency。没有骰子。
  • 我已经尝试了几个我在这里找到的 excludeAll 示例。没有骰子。
  • 出于绝望,我解压缩了 jar,删除了 slf4j,然后再次创建了 jar。它有效!但说真的,这不是我维护项目的首选。

有没有人知道如何排除 Uber jar 中的某些内容,该内容是基于 sbt 的 scala 或 play 项目中的非托管依赖项?

【问题讨论】:

    标签: scala jar sbt unmanaged uberjar


    【解决方案1】:

    你可以shade你的托管 slf4j 库,让它看起来没有依赖冲突。为此,您可以使用sbt-assembly 着色能力。

    例如,如果您使用的是slf4j-api,它将如下所示:

    assemblyShadeRules in assembly ++= Seq(
      ShadeRule.rename("org.slf4j.slf4j-api.**" -> "my_slf4j.@1")
        .inLibrary("org.slf4j" % "slf4j-api" % "1.7.21")
        .inProject
    )
    

    这将导致任何使用这个特定版本的 slf4j 的东西用 my_slf4j 前缀而不是 org.slf4j 来改变它的包名。

    【讨论】:

    • 感谢您的回复,但正如我所提到的,我需要托管版本(也可以以任何方式排除在依赖项中),因为它是较新的版本。我需要以某种方式排除非托管库中的版本。
    • 托管版本是用uber jar编译的,不是吗?如果是的话,shading 功能会对jar 内部使用的内部库进行遮蔽,我认为是你想要的 wjat
    猜你喜欢
    • 2019-01-10
    • 2015-04-12
    • 2017-01-19
    • 1970-01-01
    • 2020-02-04
    • 2019-07-16
    • 2021-09-05
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多