Le dimanche 11 juin 2023, 23:31:36 CEST Hunter C Payne a écrit :
>  Strange question but maybe it will inspire someone else.  Why does the POM
> the user uses to control the build the exact same format as the POMs
> created to express the results of the build?  Is that necessary?
it has been done in early Maven 2 and Maven Central creation, near 20 years 
ago: why do more complex? And how, when at that time all the concepts had to 
be invented and implemented to simply work first.

> It seems
> to me the discussion is about the drawbacks of that approach.  Perhaps its
> needed for reproducible builds or something but it seems to me those two
> use cases are different and the difficulty comes from trying to make one
> stable format serve both use cases. Hunter
that's why the concepts of build/consumer POM were introduced [1] 5 or 6 years 
ago and the plan about Maven 4 and 5 [2]

with summaries of the history [3] done while working on it

Regards,

Hervé


[1] https://cwiki.apache.org/confluence/display/MAVEN/Build+vs+Consumer+POM

[2] https://cwiki.apache.org/confluence/display/MAVEN/Maven+Core+Roadmap

[3] https://www.javaadvent.com/2021/12/from-maven-3-to-maven-5.html

> 
>     On Sunday, June 11, 2023 at 02:12:49 PM PDT, Romain Manni-Bucau
> <rmannibu...@gmail.com> wrote:
>  Le dim. 11 juin 2023 à 22:28, Guillaume Nodet <gno...@apache.org> a écrit :
> > Those are actually two different questions, but I'd like to raise those
> > together, since they do affect the same feature.
> > 
> > 1/ We currently don't have an XML schema for the build POM.  One
> > possibility would be to relax a bit the constraints on the main POM schema
> > (
> > http://maven.apache.org/xsd/maven-4.0.0.xsd) so that some elements are not
> > mandatory in the xml.  By not modifying the validation rules, those
> > elements will have to be present in the object model, so that should be
> > safe.  Another option would be to have a separate schema, but given the
> > small set of changes on the build pom on the current constraints, i
> > think the first solution would be better.  As a reminder, the build pom
> > supports: inferring version for artifacts that are part of the reactor
> > (that's usually done using managedVersion), inferring the relativePath
> > element, ci friendly interpolation for the version.
> 
> +1 to relax
> 
> > 2/ the consumer POM could be streamlined much more using the same
> > techniques than used in the flatten-maven-plugin. Currently, we're only
> > removing the <modules> element, but we could remove the full build
> > section,
> > flatten dependencies, etc...  Packaged artifacts (i.e. with a non pom
> > packaging), can only be used as dependencies, so I think the whole
> > flattening process could make sense.  Is there any drawback in doing so ?
> > Any particular reason the consumer POM support is limited to removing
> > modules and does not go further ?  I can see some discussion in
> > https://cwiki.apache.org/confluence/display/MAVEN/Build+vs+Consumer+POM
> > but
> > those do not seem to be settled.
> 
> Doesnt flattening break transitive dep resolution since depth changes?
> 
> Also drops some build meta which cant be resoled anymore portably like
> compiler setup, which graalvm version was used and lastly would need to
> drop or not props not used elsewhere.
> Think staying as close as possible of the source is overall good to consume
> as intended (build control) until the transformer is fully configurable
> (never hopefully since it sounds overcomplicated).
> 
> > Le ven. 9 juin 2023 à 11:22, Guillaume Nodet <gno...@apache.org> a écrit :
> > > Le ven. 9 juin 2023 à 08:59, Hervé Boutemy <herve.bout...@free.fr> a
> > > 
> > > écrit :
> > >> adding a new POM element in build POM was supposed to be something for
> > >> Maven 5
> > >> and to trigger a POM 5 version, to make clear that we are leaving the
> > >> Maven 3
> > >> space (that uses POM version 4, hence the need for version
> > >> clarification
> > >> between Maven and it POM model version)
> > >> 
> > >> if we enter that space before having released Maven 4, we're adding
> > >> more
> > >> complexity: do you really want to work on Maven 5 now?
> > >> 
> > >> 
> > >> another aspect:
> > >> do we want to have this new improvement only for Maven 4/5 or also have
> > >> it for
> > >> Maven 3.9?
> > >> in Maven 3.9, such little enhancement were implemented as XML
> > >> attributes
> > > 
> > > Fwiw, if I reduce the diff between the XSD generated with 3.0 and with
> > > 3.9.x, I end up with the following diff
> > > https://gist.github.com/gnodet/f8dfd3206ebf55d6e4610a25e683120b
> > > So, you're right, no new elements have been introduced. A few attributes
> > > added, one element removed.
> > > 
> > > However I really don't understand how adding an attribute vs an element
> > > makes the POM more compatible. Our own generated parser will reject any
> > > unknown new attribute the same way as an unknown element (that's for any
> > > maven 3.x version). Here's what happen if I use a maven 3.2.5 to read a
> > 
> > POM
> > 
> > > with an element that has been introduced later:
> > > https://gist.github.com/gnodet/35a3ad4d449e586dc282c08eacc82ed0
> > > So I'm not really buying the argument about attribute / element at this
> > > point.  If that could be clarified, it would be nice !
> > > 
> > > So I think the question comes down to: do we prefer
> > > modifying/overwriting
> > > the schema as we did in the past or do we prefer cleanly versioning it.
> > 
> > In
> > 
> > > both cases, I think we need to keep it compatible, i.e. only add
> > > elements/attributes.  The first option is much easier to implement: just
> > 
> > do
> > 
> > > nothing as we did in the past, but this has the drawback of not giving
> > > people/tools much warning or information about possible changes.  We
> > 
> > simply
> > 
> > > overwrite the schema from the web site with the latest one at each
> > 
> > release,
> > 
> > > hoping that tools will not see the change and that they don't really
> > 
> > cache
> > 
> > > the schema (in case you really need the latest). The other option is to
> > > more properly version the schema.  This would need additional code if we
> > > want to correctly detect which version is the lower version needed to
> > > correctly write a given POM.  But even for doc changes, I think it may
> > > be
> > > preferable to micro version the schemas.
> > > 
> > > The scm.child.xxx attributes that were added are not meaningful for the
> > > consumer afaik: they are used for build time and for doc, when you use
> > > an
> > > artifact as a dependency (i.e. on the consumer side), those attributes
> > > won't be used.  So from a consumer POV, they don't carry any semantics
> > 
> > and
> > 
> > > can safely be silently discarded.  This is also the case for this new
> > > priority attribute, as it only affects the current project or child
> > > projects.  In that sense this new feature could just be silently added
> > > to
> > > the schema as previous things, so I'm fine with not versioning the
> > > schema
> > > now if that's the consensus.
> > > 
> > > The problem (and that's really something we need to fix), is that we
> > 
> > don't
> > 
> > > any real difference between the build POM and the consumer POM schemas.
> > 
> > We
> > 
> > > also don't make a real difference between consuming as a bom /
> > 
> > dependency /
> > 
> > > plugin, and consuming as a parent.  Both cases are really different, as
> > 
> > the
> > 
> > > first one could strip out most of the <build> section.  One possibility
> > > would be to more formerly identify those 3 use cases (build on file
> > 
> > system,
> > 
> > > consuming as a dependency and consuming as a child).  Note that we're
> > > currently lacking a build schema, so that when using the build/consumer
> > > POM, your build schema cannot be validated, as it's missing some
> > 
> > elements.
> > 
> > > One possibility would be to simply make some elements non mandatory in
> > 
> > the
> > 
> > > schema.  The model validation would check those anyway.  For the
> > > consumer
> > > POM for non "pom" packaging, would it make sense to streamline the
> > 
> > uploaded
> > 
> > > POM even more: i.e. remove all build stuff from it (pluginRepositories,
> > > pluginManagent, plugins, reporting, etc...) or is there any use case for
> > > keeping those ?  We could attach the build pom (i.e. we're currently
> > > switching the POM when installing/deploying it, but it's attached with a
> > > "consumer" classifier during the build).
> > > 
> > > Guillaume
> > > 
> > >> and of course, independently from this XML mapping and version details,
> > >> there
> > >> is the question to be seriously discussed about the feature itself: is
> > >> this
> > >> opportunity of introducing the "priority" field something we want (that
> > >> reuses
> > >> an implementation that is de-facto already existing internally for a
> > 
> > long
> > 
> > >> time, it just exposes it)
> > >> 
> > >> Regards,
> > >> 
> > >> Hervé
> > >> 
> > >> Le jeudi 8 juin 2023, 22:56:27 CEST Guillaume Nodet a écrit :
> > >> > 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
> > >> 
> > >> 
> > >> 
> > >> 
> > >> 
> > >> ---------------------------------------------------------------------
> > >> To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
> > >> For additional commands, e-mail: dev-h...@maven.apache.org
> > > 
> > > --
> > > ------------------------
> > > Guillaume Nodet
> > 
> > --
> > ------------------------
> > Guillaume Nodet





---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
For additional commands, e-mail: dev-h...@maven.apache.org

Reply via email to