1

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

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

这是我尝试过的。

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

有谁知道在基于 sbt 的 scala 或 play 项目中排除 Uber jar 中的非托管依赖项的方法?

4

1 回答 1

0

您可以遮蔽您的托管 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.

于 2016-06-12T09:07:03.930 回答