While working on an issue [1], I've raised a PR [2] which is adding an xml
element to the POM.  So I raised the model version to 4.2.0.  My
understanding is that the build/consumer POM feature [3] was created so
that we could keep compatibility.  This is clearly indicated in the wiki
page:  "Maven is stuck on POM v4 for a long time now, because changing the
POM version and publishing artifacts on Maven Central with this new model
would break consumers using either older Maven versions or other build
tools (that use POM v4 as a compatibility format)."

However, I think this axiom is false.  What happens, is that all maven
versions are perfectly capable of consuming any model when used as a BOM /
dependency / plugin, as the parser simply ignores any unknown attribute or
element.  I can install a jar with the 4.2.0 model and consume it with any
3.x version without any problem.  The only issue is when using that project
as a parent, in which case, the validation is strict and fails with the
4.2.0 model.

So, saying that "new model would break consumers using [...] older Maven
versions" is just wrong, as they work perfectly when consuming the POM as
dependencies.  I can create a small git repo if you want to experiment, but
that has been first checked by @cstamas, then double checked by myself.

Now, the discussion is whether we want to allow modifications to the POM
model and support new versions of it.  I think this would be quite safe,
provided that there's no incompatible changes, i.e. it's only adding new
elements/attributes.
I don't think this goes against the build/consumer feature, as I think the
main benefit of this feature is to allow default values using sane
conventions (mainly the project layout on the file system, which is not
available anymore in the remote repository, so this data has to be present
for consumers).

So, the question: should we go ahead and allow introducing newer POM models
to bring in a few features that have been delayed for a long time because
the assumption was that the model could never change ?  One possibility to
minimize the disruption would be to have a smart POM writer : i.e. it could
transform the POM to a 4.0.0 model if no new features are actually used, so
that only projects actually using the newly introduced features would
actually use the 4.x pom version.

Guillaume

[1] https://issues.apache.org/jira/browse/MNG-7804
[2] https://github.com/apache/maven/pull/1147
[3] https://cwiki.apache.org/confluence/display/MAVEN/Build+vs+Consumer+POM
-- 
------------------------
Guillaume Nodet

Reply via email to