On Friday, 20 June 2014, Igor Fedorenko <[email protected]> wrote:
> I am not sure I follow.
>
> Do you want to allow multi-module projects where different modules
> require different versions of maven?
No I want to allow multi-module projects where the maximum modelVersion
defines the minimum required version of maven to build.
>
> If required version of maven is the same, why not require the same pom
> format version for the entire build too?
Because I may be working on several things that I am throwing together in
a local aggregator pom... Because I am working on a module that I cannot
change the build process for and another module at the same time that needs
the newer features
Are you concerned about changes
> to pom.xml files when moving from one format version to the next or
> something else?
I want to be able to migrate modules to newer build poms when they are
ready to do so. That may mean that I have a project with one child that can
be built by Maven 2.0 another that needs maven 3.2.2 and a 3rd that needs
maven 4.1. To build that reactor I need to use maven 4.1 or newer... Or I
can not use a reactor and push things to the local repo and build the first
module with maven 2.0, change my PATH, build the second module with maven
3.2.2, change my PATH again and build the last module with Maven 4.1... All
pushing to the local repo... Hoping that we haven't changed the local repo
format... Hoping that I've remembered to do that all correctly, and all for
the same feature branch... Oh I got distracted and had to switch to a
different branch and back again... Sorry start at the beginning again just
to be sure.
Ok, so we can use something like RVM so that as we cd into each module we
pick up an .mvnenv file that causes our PATH to auto switch... But really?
And for this to work we have two choices... Never evolve the local repo OR
run a local remote repo to act as a maven version neutral exchange... Great
now I've gone from `mvn clean verify` to `cd foo && mvn clean deploy
-DaltDeploymentUrl=... && cd ../bar && mvn clean deploy
-DaltDeploymentUrl=... && cd ../manchu && ...` that's just great that is!
I argue that unless we keep the contract that newer maven can build all
older maven projects, then there is no point even calling new maven
"maven"...
Does it have to build them perfectly? Perhaps not, I can live with needing
to tweak things to iron out an inconsistency as long as after the tweak
both new and old build that module the same... So, for example, if the old
pom references ${pom.artifactId} and new maven cannot build that unless you
change it to ${project.artifactId} that is OK in my book as both forms are
legal in old maven so switching to the new one will not break old maven...
(Obviously better if we don't fail in that case... Just trying to give a
concrete example)
The reason is that there is a pressure keeping me from advancing that
module to Maven 4.1. Don't force me to jump through hoops just because some
a-hole is keeping that module shackled to build with Maven 2.0.6 levels of
compatibility... Because if Maven forces me to jump through those hoops...
Congratulations, Maven is now an a-hole too.
> --
> Regards,
> Igor
>
> On 2014-06-19, 11:50, Stephen Connolly wrote:
>
>> If backwards compatible interoperability is not a requirement then:
>>
>> If I upgrade one module in my multi-module build to Maven 5.1 then I am
>> forced right then and there to either:
>>
>> * upgrade all of them to Maven 5.1; or
>> * remove the module from my multi-module build
>>
>> Neither of these are a good user experience in my mind. Maven 5.1 should
>> be
>> able to build a Maven [2.0,5.1] project without modifying the pom... it
>> can
>> do that by loading shim layers on demand if necessary, but to my thinking
>> anything less is going to cause issues for users.
>>
>>
>> So to my thinking we just accept that Maven needs to evolve such that for
>> every version X.Y of Maven you know that you can build a Maven project
>> from
>> the range [2.0,X.Y].
>>
>> If you have a project that has a parent, then the parent must be in a pom
>> format that buildable by Maven [2.0,${project.prerequisites.maven}], so a
>> child pom requiring Maven 5.1 to build can have a parent pom that requires
>> Maven 5.0 to build but not a parent pom requiring Maven 5.2... there may
>> even be turtles all the way down to an ancestor pom that requires Maven
>> [2.0,3.0.3] to build (IIRC after 3.0.3 you get things like wildcards in
>> excludes due to aether injecting "bonus" functionality... that should have
>> been a modelVersion bump in the strictest sense... but well it wasn't)
>>
>> I also think people overestimate how difficult it is to maintain backwards
>> compatibility.
>>
>> I have a Jenkins plugin that was written against Hudson 1.96 and I can
>> take
>> that .hpi file and drop it into Jenkins 1.568 and it still works
>> unmodified. Similarly I can upgrade a Jenkins installation jumping quite a
>> large number of versions without issue.
>>
>> It is possible to evolve and maintain the ability to read older data... is
>> it easy? well it's not trivial, but it is a disservice to our users if we
>> don't try
>>
>>
>> On 19 June 2014 16:24, Paul Benedict <[email protected]> wrote:
>>
>> I am curious why you interoperability as a requirement? Perhaps
>>> questioning
>>> that may seem outrageous, but I see no problem with saying that you need
>>> to
>>> upgrade to Maven X.Y to read newer POM formats. If a vendor wants to
>>> backport their project into older POM formats, that should be the
>>> vendor's
>>> shoulders and not be a concern of Maven core. If Maven does publish older
>>> formats of POMs, you then have to decide how many older formats do you
>>> want
>>> to publish? One day there will be a 4.1 or 5.0, and it's going to
>>> complicate the world if Maven takes on the burden of interoperability.
>>>
>>>
>>> Cheers,
>>> Paul
>>>
>>>
>>> On Thu, Jun 19, 2014 at 9:57 AM, Stephen Connolly <
>>> [email protected]> wrote:
>>>
>>> On 19 June 2014 15:48, Igor Fedorenko <[email protected]> wrote:
>>>>
>>>>
>>>>>
>>>>> On 2014-06-19, 10:30, Stephen Connolly wrote:
>>>>>
>>>>> - Igor is*mostly* right in that we should not deploy the pom that is
>>>>>>
>>>>> used
>>>>
>>>>>
>>>>>> to build to the repository...
>>>>>> - Where Igor is wrong is that for <packaging>pom</packaging> we should
>>>>>> actually deploy the build time pom to the repository... probably with
>>>>>>
>>>>> the
>>>>
>>>>> classifier `build`... this is safe as `pom` does cannot have a
>>>>>>
>>>>> classifier
>>>>
>>>>> in model version 4.0.0.
>>>>>> - You couple that with a simple and obvious restriction... your parent
>>>>>> must
>>>>>> be the same or earlier version of Maven. You cannot have as a parent a
>>>>>> newer version of Maven than the child is built with.
>>>>>>
>>>>>>
>>>>> I think there is more to this.
>>>>>
>>>>> At very least we need to decide what to do with <parent> in 4.0.0
>>>>> compatible poms. Maybe we should always deploy effective pom with
>>>>> build-related elements removed.
>>>>>
>>>>>
>>>> Well I think the simple thing is that the 4.0.0 pom is fully resolved
>>>>
>>> when
>>>
>>>> you have a builder pom
>>>>
>>>>
>>>>
>>>>> I am also not sure if it is enough to deploy "build" parent poms as is.
>>>>> Your suggested "parent must be the same or earlier version of Maven"
>>>>> implies new versions of Maven can read older pom formats, which I think
>>>>> will significantly limit our flexibility to evolve pom format.
>>>>>
>>>>
>>>>
>>>> They need to be able to parse it into the model. Perhaps they do the
>>>> parsing by downloading a parser. But I think it is reasonable to expect
>>>> that we can convert older build pom formats into newer ones and just let
>>>> Maven take care of it... if we cannot do that then we are really
>>>>
>>> creating a
>>>
>>>> brand new build tool rather than evolving Maven
>>>>
>>>>
>>>> I wonder
>>>>> if we can have different solution for force parent poms, like
>>>>> org.apache:apache, which are used by multiple projects and different
>>>>> versions of maven and project-specific parent poms, where it is much
>>>>> easier to require specific version of maven.
>>>>>
>>>>>
>>>> Well the simple way is we have deployed the 4.0.0 parent pom as
>>>> org.apache:apache:14:pom if you want to upgrade your parent to
>>>> org.apache:apache:15 then you will need to require Maven 4.0+ to build.
>>>>
>>> If
>>>
>>>> you don't want to upgrade your build time requirements, then don't
>>>>
>>> upgrade
>>>
>>>> the parent... and if we need to "fix" things in the parent for 4.0.0
>>>> consumers, we can always deploy org.apache:apache:14.1 as a newer 4.0.0
>>>> model pom
>>>>
>>>>
>>>> --
>>>>> Regards,
>>>>> Igor
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: [email protected]
>>>>> For additional commands, e-mail: [email protected]
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
--
Sent from my phone