Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-683
     looks to add a layer of indirection to the lifecycle bindings such that, say the "compile" phase could be bound to a generic "compiler" goal and then another layer could define that for a specific project / packaging the "compiler" generic goal would be fulfilled by a specific plugin's goal execution.
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3522
     looks to define a specific plugin execution order within a phase. The driver for this use case is that the lifecycle cannot be customised so when a module needs a complex lifecycle in order to ensure correct inter-plugin execution order
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5665
     looks to introduce more advanced constraints on the lifecycle, such as "finally" concepts as well as fork-points in the lifecycle, such as "either install or deploy but not both"

Overview

TODO write this up... I'm just dumping stuff I have done on the mail thread here to make it easier to collaborate:

Scope related changes

There is no specific set of themes here:

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-1867
     looks to remove system scope.
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-6107
     looks to introduce a scope that would allow mix-ins for dependencyManagement

Profile activation

The following issues are all focused on gaps in profile activation:

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3326
     looks to define profile deactivators which would be the inverse of profile activators. Some of the use cases seem a bit hacky, but as a principal being able to express activation via an inverse condition can be simpler for users to comprehend.
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3826
     looks to be able to have profiles activated based on the project version
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5650
     looks to make the activators into an extension point.

POM format

The following issues look to address deficiencies (perceved or otherwise) in the modelVersion 4.0.0 POM format:

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3397
     looks to switch to attributes for some of the more annoying verbosity in the POM
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5653
     looks to switch to attributes for some of the more annoying verbosity in the POM
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-6061
     looks to switch from XML to a custom DSL
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5654
     looks to move the build/pluginManagement tag to the root level.

Mix-ins

The following issues look for mix-ins that allow content for the POM to be included from other sources:

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5102
     looks for general purpose mix-ins
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5588
     looks for an explicit pluginManagement scoped mix-in

Proposal

 

TODO write this up... I'm just dumping stuff I have done on the mail thread here to make it easier to collaborate:

Code Block
xml
xml
<project modelVersion="5.0.0" [groupId="..."] artifactId
Code Block
xmlxml
<project modelVersion="5.0.0" [groupId="..."] artifactId="..." [version="..."] packaging="...">
  [<parent groupId="..." artifactId="..." [version="..."] [relativePath="...']/>

  [<mixin groupId="..." artifactId="..." [version="..."]/>]
  [<mixin groupId="..." artifactId="..." [version="..."]/>]
  ...
  [<mixin groupId="..." artifactId="..." [version="..."]/>]

  [<lifecycle id="..." mode="override|inherit">
    <phase id="..." [after="..." | before="..."]/>
    <phase id="..." [after="..." | before="..."]/>
    ...
    <phase id="..." [afterversion="..."] | beforepackaging="..."]/>

  </lifecycle>]
  [<lifecycle id[<parent groupId="..." artifactId="...">
     [version="...
  </lifecycle>]
  "] [relativePath="...']/>

  [<lifecycle<mixin idgroupId="...">
     artifactId="..." [version="...
  </lifecycle>"]/>]

  [<scope<mixin idgroupId="compile..." artifactId="..." [modeversion="override|inherit..."]/>]
  ...
  <dependency[<mixin groupId="..." artifactId="..." [platformIdversion="..."] version/>]

  [<lifecycle id="..." mode="override|inherit">
    <phase id="..." [classifierafter="..."] | typebefore="..."]/>
 <!-- type is mandatory-->
    <dependency groupId<phase id="..." artifactId="..." [platformId[after="..."] version="..." [classifier | before="..."] type="..."/>
    ...
    <dependency<phase groupIdid="..." artifactId[after="..." [platformId| before="..."] version="..." [classifier="..."] type="..."/>
  </scope>]
  [<scope/>

  </lifecycle>]
  [<lifecycle id="...">
    ...
  </scope>lifecycle>]
  ...
  [<scope<lifecycle id="...">
    ...
  </scope>lifecycle>]

  [<plugins<scope id="compile" [mode="override|inherit"]>
    <!-- this is what pluginManagement was -->
  </plugins>]

  [<bindings [mode="override|inherit"]>
    <dependency groupId="..." artifactId="..." [platformId="..."] version="..." [classifier="..."] type="..."/> <!-- thistype is whatmandatory-->
 plugins was, we make explicit here that this is the binding of executions into the lifecycles -->
  </bindings>]

  [<platform id<dependency groupId="..." artifactId="..." [platformId="..."] version="..." [classifier="..."] [modetype="override|inherit"]..."/>
    <activation>...
      <!-- define how we determine that this platform can be built in the current environment -->
    </activation>
    <!-- allow platform specific mixins -->
    [<mixin groupId=<dependency groupId="..." artifactId="..." [platformId="..."] version="..." [classifier="..."] type="..."/>
  </scope>]
  [<scope  <!-- allow platform specific lifecycles -->
    [<lifecycleid="...">
    ...
  </scope>]
  ...
  [<scope id="...">
      ...
    </lifecycle>scope>]

  [<plugins [mode="override|inherit"]>
    <!-- this allowis platformwhat specificpluginManagement dependencieswas -->
    [<scope>
      ...</plugins>]

    </scope>]

[<bindings [mode="override|inherit"]>
    <!-- allowthis platformis specific bindings... but plugin management is from the root only what plugins was, we make explicit here that this is the binding of executions into the lifecycles -->
  </bindings>]

  [<bindings>
      <platform id="..." [mode="override|inherit"]>
    </bindings>]

<activation>
      <!-- allowdefine mosthow ofwe thedetermine otherthat rootthis tagsplatform exceptcan platformbe andbuilt packagingin andthe deploymentcurrent configenvironment -->
    </platform>]activation>
  [<platform id="...">
    ...
  </platform>]
  ...
  [<platform id <!-- allow platform specific mixins -->
    [<mixin groupId="...">
     artifactId="...
  </platform>]

" [version="..."]/>]
    <!-- packagingallow platform isspecific only allowed in poms with an id of "parent" or "mixin". It allows a parent/mixin to be used by different packaging ids and define specialized defaults lifecycles -->
    [<lifecycle id="...">
      ...
    </lifecycle>]

    <!-- allow platform specific dependencies -->
    [<packaging id="...">
<scope>
     [<mixin groupId="..." artifactId="..." [version="..."]/>]

    </scope>]

    <!-- allow platform specific lifecyclesbindings... but plugin management is from the root only -->
    [<lifecycle id="..."><bindings>
      ...
    </lifecycle>bindings>]

    <!-- allow most of the other root tags except platform specific dependencies and packaging and deployment config -->
  </platform>]
  [<scope><platform id="...">
      ...
    </scope>platform>]

    <!-- allow platform specific bindings...
 but plugin management is from the root only -->
    [<bindings>[<platform id="...">
      ...
    </bindings>platform>]

    <!-- allowpackaging mostis ofonly theallowed otherin rootpoms tagswith exceptan platformid andof packaging"parent" and deployment config or "mixin". It allows a parent/mixin to be used by different packaging ids and define specialized defaults -->
  </packaging>]
  [<packaging id="...">
    [<mixin groupId="...
  </packaging>]
  " artifactId="...
"  [<packaging idversion="..."]/>]
    ...
  </packaging>]

  <!-- unsure if we still need profiles -->
  <!-- perhaps we still need properties -->
  <!-- allow platform specific lifecycles -->
    [<lifecycle id="...">
      ...
    </lifecycle>]

    <!-- TBDallow deploymentplatform config,specific repositories,dependencies etc -->

</project>
 

 

Some things that came to mind, in no particular order:

  • scope becomes a build time only concern. Thus we can let users define custom scopes in their pom. If we let plugin executions declare scopes to resolve, we no longer need a compiler:testCompile goal as you can just have a second default execution of compiler:compile with different required scopes and different default configuration... bonus win, I can now add many different layers of test-compilation for integration tests, etc... each pulling in different scopes... ditto for surefire/failsafe... yeah integration tests
  • we should let the user define lifecycles directly in the Pom (ok, maybe we don't *encourage it*)
  • mixins can be properly considered... they only affect build time anyway
  • Pom doesn't need to be XML any more... (maybe we want to keep XML though... just a less verbose form)
  • does Maven 5 build Maven 2/3 projects?

 

Building the effective build time model would be:

 

  • Start with parent, add in matching packaging from parent, in Pom order, add each mix-in (including matching packaging from mix-in before processing subsequent mix-ins), finally apply local pom.

 

To compute effective lifecycle and build plan, allow platform activation to be considered... each platform is like a mini-sub project that can "run in parallel" (yes I need to doc this better...)
Issues to consider: (query project = MNG AND (fixVersion = "Issues to be reviewed for 4.x" OR component = FDPFC) if you think that other issues need to be considered, just add)

...

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-50
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3726
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-4506
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-4921
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-2216
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3608
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3879
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5926
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-2916
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5563
     (perhaps it is a legitimate concern for plugins to require parameters that have defined values from somewhere... unclear if this affects the POM though) 
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5900
    Open question do we want properties? and if we do, what interpolation rules would apply... how would parent, mix-in, platform, profiles etc take effect...
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5657
    WONT FIX I do not see the value in splitting content out of the pom... that way leads to profiles.xml which was madness
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5659
    WONT FIX I do not see the value in splitting content out of the pom... that way leads to profiles.xml which was madness

...

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-177
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5652
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-1977
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-2316
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-2316
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5867

...

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-624
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-4173
     (should just do this for 5.0.0. No more plugin version "magic")
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5517
    WONT FIX I do not see the value in moving from the range syntax to a less mathematically complete syntax

...

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-193
     (since the symmetry will feed into the lifecycle definition syntax perhaps)
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-683
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3522
     (effectively superseded as you can augment the lifecycle from within the POM and thus provide any additional phases you require in order to ensure the sequencing required)
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5384
     (this one is really important as we want to be able to enable light-weight multi-module builds that just don't fail where "clean install" would succeed - solving this will mean that the reactor can proceed across all modules as required in order to deliver the requirements of the "driving" module(s))
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5665
     (need to ensure that we address this need in the lifecycle declaration syntax)

...

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-1867
     (effectively addressed above as we remove all "special" scopes replacing them with convention)
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-6107

...

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3326
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3826
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5650

...

  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-3397
     /
    Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-5653
     (effectively addressed in the current proposal)
  • Jira
    serverASF JIRA
    serverId5aa69414-a9e9-3523-82ec-879b028fb15b
    keyMNG-6061
     switching to a DSL should be considered... though I suspect a new compact XML would be less of an issue while retaining some ability to allow earlier maven versions to at least print semi-sensible errors if attempt is made to build new pom with old maven
    [<scope>
      ...
    </scope>]

    <!-- allow platform specific bindings... but plugin management is from the root only -->
    [<bindings>
      ...
    </bindings>]

    <!-- allow most of the other root tags except platform and packaging and deployment config -->
  </packaging>]
  [<packaging id="...">
    ...
  </packaging>]
  ...
  [<packaging id="...">
    ...
  </packaging>]

  <!-- unsure if we still need profiles -->
  <!-- perhaps we still need properties -->
  <!-- TBD deployment config, repositories, etc -->

</project>
 

 

Some things that came to mind, in no particular order:

  • scope becomes a build time only concern. Thus we can let users define custom scopes in their pom. If we let plugin executions declare scopes to resolve, we no longer need a compiler:testCompile goal as you can just have a second default execution of compiler:compile with different required scopes and different default configuration... bonus win, I can now add many different layers of test-compilation for integration tests, etc... each pulling in different scopes... ditto for surefire/failsafe... yeah integration tests
  • we should let the user define lifecycles directly in the Pom (ok, maybe we don't *encourage it*)
  • mixins can be properly considered... they only affect build time anyway
  • Pom doesn't need to be XML any more... (maybe we want to keep XML though... just a less verbose form)
  • does Maven 5 build Maven 2/3 projects?

 

Building the effective build time model would be:

 

  • Start with parent, add in matching packaging from parent, in Pom order, add each mix-in (including matching packaging from mix-in before processing subsequent mix-ins), finally apply local pom.

 

...

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyMNG-5102

...

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyMNG-5588

...

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyMNG-5654

...

Appendix 1 - Issues flagged for consideration post-modelVersion 4.0.0

This is not a perfect query as it includes issues that target behavioural changes outside the scope of modelVersion changes, but all the relevant issues should be a subset of this list

Jira
serverASF JIRA
columnskey,summary,type,status
maximumIssues60
jqlQueryfilter=12338619
serverId5aa69414-a9e9-3523-82ec-879b028fb15b