Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sbt assembly: deduplicate module-info.class

I get the following error when assembling my uber jar:

java.lang.RuntimeException: deduplicate: different file contents found in the following: [error] /Users/jake.stone/.ivy2/cache/org.bouncycastle/bcprov-jdk15on/jars/bcprov-jdk15on-1.61.jar:module-info.class [error] /Users/jake.stone/.ivy2/cache/javax.xml.bind/jaxb-api/jars/jaxb-api-2.3.1.jar:module-info.class

I am not up to date with java technology, but assume I cannot simply discard one of these classes.

Can someone tell me what mergeStrategy I can use to safely compile the uber jar?

like image 593
Jake Avatar asked Feb 22 '19 19:02

Jake


1 Answers

The answer depends on your environment and what you want to achieve.

JDK 8

I had the same problem with a project using JDK 8. JDK 8 does not use the file module-info.class so it is safe to discard the file.

Add the following to your build.sbt:

assemblyMergeStrategy in assembly := {
  case x if x.endsWith("module-info.class") => MergeStrategy.discard
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}

This simply discards the files.

JDK 11

If you use JDK 11 with an end user project (not a library) then it should also be safe as if you create the uber-jar all classes are included and no external dependencies are needed. Just tested it with a short test (not thoroughly enough to say it is always safe).

If you use JDK 11 and create a library then it is better not to create an uber-jar. In this case a dropping of the module-info.class will most likely create a jar that will not work. In this case simply depend on the libraries.

like image 70
Uwe Plonus Avatar answered Sep 20 '22 11:09

Uwe Plonus