Should sbt-assembly perform a "maven-shade-plugin"-like relocation of classes?
Asked Answered
C

1

5

The description of sbt-assembly merge strategy called rename sounded like it might permit something similar to the shading operation of the maven-shade-plugin which will relocate classes and their references to permit the management of incompatible versions of libraries.

Would it be appropriate for sbt-assembly to perform that function?

I used the following merge strategy to attempt to use rename as a relocation mechanism but while it matches all the files, it passes them straight through (which is consistent with looking at the code).

assemblyMergeStrategy in assembly := { s =>
  s match {
    case PathList("com", "clearspring", "analytics", _*) => {
      println("match_cs: " + s)
      MergeStrategy.rename
    }
    case x => {
       println("x: " + x)
       val oldStrategy = (assemblyMergeStrategy in assembly).value
       oldStrategy(x)
    }
  }
}
Cullet answered 4/3, 2015 at 3:53 Comment(4)
I see part of this is answered here that sbt-assembly doesn't shade. Which leaves the part "would it be appropriate" ?Cullet
Did this ever worked?? I am in the same situation...Ravioli
@Ravioli : No, per my link, sbt-assembly won't do that transformation. You just have to monkey around with sbt excludes and they are very dependent on the current set of dependent jars.Cullet
sbt now has shade support in sbt#master via this PRSiebert
G
7

Updated in September 2015:

sbt-assembly 0.14.0 adds shading support.

sbt-assembly can shade classes from your projects or from the library dependencies. Backed by Jar Jar Links, bytecode transformation (via ASM) is used to change references to the renamed classes.

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("org.apache.commons.io.**" -> "shadeio.@1").inAll
)
Geraldina answered 20/6, 2015 at 5:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.