2016-06-11 134 views
1

我有一个项目,我必须为一些专有硬件包括一个fat-jar - 不要问,我知道它最适合在Central或其他某个回购站上使用,但事实并非如此。 :(我必须把它放在lib目录下,所以sbt会把它当作一个非托管的依赖项。不包括优步(胖)罐在sbt播放!在斯卡拉

但是jar包含slf4j,它的一个旧版本,当Play!运行时抛出一个错误,抱怨静态功能缺失(这是在SLF4J的较新版本中添加的。

这是我都试过了。

  • 我试图添加使用libraryDependency力()。没有骰子。
  • 我已经尝试了一些我在这里找到的不包括所有样本。没有骰子。
  • 出于绝望的绝望,我解压缩了jar,删除了slf4j,并再次创建了jar。它工作!,但严重的是,这不是我维护该项目的首选。

有没有人知道一种方法来排除Uber jar中的某些东西,这是一个基于sbt的scala或play项目中的非托管依赖项?

回答

0

你可以shade你的托管slf4j库,并使其看起来没有依赖冲突。要做到这一点,你可以使用着色能力sbt-assembly

例如,如果你使用slf4j-api,它应该是这样的:

assemblyShadeRules in assembly ++= Seq(
    ShadeRule.rename("org.slf4j.slf4j-api.**" -> "[email protected]") 
    .inLibrary("org.slf4j" % "slf4j-api" % "1.7.21") 
    .inProject 
) 

这将使用SLF4J的这个特定版本来改变它,因为任何事情都有一个my_slf4j前缀,而不是org.slf4j包名。

+0

感谢您的回复,但正如我所提到的,我需要托管版本(它也可以以任何方式排除在依赖项中),因为它是较新的版本。我需要以某种方式排除非托管库中的版本。 – Reza

+0

托管版本是用超级jar编译的,不是吗?如果是这样,阴影功能将阴影在jar内部使用的内部库,我认为这是你想要的wjat –