不包括优步(胖)罐子在玩!在Scala

时间:2016-06-11 16:07:07

标签: scala jar sbt unmanaged uberjar

我有一个项目,我必须为一些专有硬件包含一个胖罐 - 不要问,我知道它最好用于中央或其他回购的jar,但事实并非如此。 :(我必须将它放在lib目录中,因此sbt会将其视为非托管依赖项。

但是jar包括slf4j,它的旧版本,以及Play!运行它会抛出一个错误,抱怨静态函数丢失(在较新版本的slf4j中添加了。

这是我尝试过的。

  • 我尝试使用force()添加libraryDependency。没有骰子。
  • 我在这里找到了几个excludeAll样本。没有骰子。
  • 出于绝望,我解开罐子,取出了slf4j,再次创造了罐子。它工作!,但严重的是,这不是我维护项目的首选。

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

1 个答案:

答案 0 :(得分:0)

您可以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更改其包名称。