How to exclude transitive dependencies of other subproject in multiproject builds?
This appears to work for me:
val someApp = project.settings( libraryDependencies += "junit" % "junit" % "4.11")val androidApp = project.dependsOn(someApp).settings( projectDependencies := { Seq( (projectID in someApp).value.exclude("junit", "junit") ) })
What the projectDepenendencies is doing is what sbt, by default, attempts to do. It converts any inter-project dependencies into ModuleID
s which Ivy will use during resolution. Because the Project
API has no way to specify excludes currently, we bypass this automatic layer and manually declare the Ivy dependency as well.
Result:
> show someApp/update...[info] Update report:...[info] compile:[info] org.scala-lang:scala-library:2.10.4 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/home/jsuereth/.sbt/boot/scala-2.10.4/lib/scala-library.jar)[info] junit:junit:4.11: (Artifact(junit,jar,jar,None,ArraySeq(master),None,Map()),/home/jsuereth/.ivy2/cache/junit/junit/jars/junit-4.11.jar)[info] org.hamcrest:hamcrest-core:1.3: (Artifact(hamcrest-core,jar,jar,None,ArraySeq(master),None,Map()),/home/jsuereth/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar) ...
And the dependent project with junit/hamcrest excluded:
> show androidApp/update...[info] Update report:...[info] compile:[info] org.scala-lang:scala-library:2.10.4 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/home/jsuereth/.sbt/boot/scala-2.10.4/lib/scala-library.jar)[info] someapp:someapp_2.10:0.1-SNAPSHOT: ...