In Build.scala
I have a dependency between projects:
val coreLib = Projects.coreLib() val consoleApp = Projects.consoleApp().dependsOn(coreLib) val androidApp = Projects.androidProject().dependsOn(coreLib/*, exclusions = xpp */)
Core library project defines a library in its libraryDependencies
(XPP parser), which I want to exclude in androidApp
, since Android framework have its own XPP implementation out of the box.
How can I exclude XPP library from transitive dependencies of coreLib
in androidApp
project?
EDIT:
According to my research exclusion is possible ONLY to ModuleID
which is used in conjunction with libraryDependency
. Meanwhile dependsOn
puts all transitive dependencies to classpath, there is no way in api to exclude some transitive dependencies of this project, you dependsOn
DETAILS:
I'm running sbt 0.13.5 currently.
libraryDependencies
of commonLib as well as it various settings supplied in build.sbt so that this project could be reused as standalone, and because it feels right and natural way of supplying settings in sbt
.
When you specify a dependency in your build script, you can provide an exclude rule at the same time telling Gradle not to pull in the specified transitive dependency. For example, say we have a Gradle project that depends on Google's Guava library, or more specifically com.
Multiple transitive dependencies can be excluded by using the <exclusion> tag for each of the dependency you want to exclude and placing all these exclusion tags inside the <exclusions> tag in pom. xml. You will need to mention the group id and artifact id of the dependency you wish to exclude in the exclusion tag.
Don't include transitive dependencies. Exception: if you are relying on it in your code (see Z in the graph above), you must declare it. See below for proper handling in these (rare) cases.
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: ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With