POM relocation
Do you use Gradle for XML projects? Are you sick of the POM relocation warning for xml-apis? Me too!
Over the past several years, I’ve adopted Gradle as my go-to build
tool
That’s not strictly true; I’m learning to
use sbt
with my Scala projects.
for any project that has a
JVM component. There’s a simple reason why:
Maven just works.
I’m not enamored of Groovy, really, but I’ve mostly reached the point where I can wrestle it into submission. I’ve written a couple of extensions that I find convenient, and there’s a really good extension for working with MarkLogic.
If you use Gradle for XML projects, the odds are good that you see this warning on every build:
POM relocation to an other version number is not fully supported in Gradle :
xml-apis:xml-apis:2.0.2 relocated to xml-apis:xml-apis:1.0.b2.
Please update your dependency to directly use the correct version
'xml-apis:xml-apis:1.0.b2'.
Resolution will only pick dependencies of the relocated element.
Artifacts and other metadata will be ignored.
You can ignore it, of course, but it irks me every time. I like my builds to be completely clean. Clean builds encourage good build hygiene and draw your attention to errors more quickly.
It’s doubly annoying because the xml-apis
dependency isn’t one of
mine. It’s a transitive dependency of some other package (which is
probably in turn a transitive dependency of something else) way down
the hierarchy from anything I’m using directly.
The underlying problem is,
apparently, caused by the fact that the
2.0.2 version of xml-apis:xml-apis
just points to version 1.0.b2 for
its implementation and this “relocation” confuses Gradle. Frankly, it
confuses me too, because there’s a 1.4.01 (sic) version of the APIs
and I really don’t understand what’s going on with 2.0.2. But that’s a
mystery for another day. (If anyone knows who’s responsible for
xml-apis
in Maven, I’d sure like to encourage them to sort out this
versioning mess.)
The other day, I made a typo in my Gradle file and that sent me down
a little web searching rabbit hole. Before I found my error and resurfaced,
I stumbled across the following Gradle feature: you can declare various
resolution strategies for dependencies. One of the strategies is force
,
as in:
configurations.all {
resolutionStrategy {
force 'xml-apis:xml-apis:1.4.01'
}
}
Add that to your Gradle file to (1) tell Gradle to use the 1.4.01 version
of xml-apis:xml-apis
regardless of what’s in the dependency chain
and (2) stop Gradle from giving that blasted relocation warning!
You’re welcome.