Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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)
    }
  }
}
like image 980
Traveler Avatar asked Mar 04 '15 03:03

Traveler


1 Answers

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
)
like image 125
Eugene Yokota Avatar answered Sep 24 '22 00:09

Eugene Yokota