On 2017-03-02T10:29:30 -0600 Curtis Rueden <ctrue...@wisc.edu> wrote:
> > it seems that I can only require that the XML elements be overridden > > in *all* descendant POMs, and this introduces too much redundancy. > > I see. > > Would it be sufficient if the requireElements rule had a multiModule flag > which, if set, green-lighted the build when the stated elements are defined > in the local parent POM? This feature would assume you are using the > aggregator==parent scheme, and follow the <relativePath> declared in the > <parent> of each POM. If it finds a POM there, it would parse it and then > check for the required elements in _that_ POM instead of the initial one. > And do this recursively, in case you have a multi-layered multi-module > build. > > The downside of this approach: modules of a project would only build if the > parent is available locally. E.g.: if you try to build one module of a > multi-module build which has been physically disconnected from its parent > (e.g., a partial SVN checkout), the enforcer would fail because it would > not find the local parent POM to validate against. One can also imagine > various "aggegator != parent" organizations where the parent is not > available locally, which would also all fail to support this scheme. > I'd need to think a bit more about it, but I personally dislike relativePath and have never used it (across hundreds of projects), pretty much for the sorts of reasons you've described. Hard-coding paths that represent links to other modules seems like a horrendously bad idea. I've written a few plugins, but I'm not intimately familiar with the Maven API: Shouldn't it be possible to recursively retrieve the parent POMs from the reactor (and failing that, the local and remote repositories) within the plugin? That would remove the need for <relativePath>. If that is possible, then I think the pseudocode is: let root(p) be the root POM of project p let parent(p) be the parent of p let definesElements(p) return true if p defines the required elements Project q = p while (!done) { if (q == root(p)) { throw RequiredElementsMissing() } if (definesElements(q)) { done = true } q = parent(p) } This feels like it would achieve what I need with only minimal assumptions about the hierarchy of projects. M
pgp1IyM3UMFWw.pgp
Description: OpenPGP digital signature