Details

      Description

      I am looking for a way to mixin POM fragments into POMs. Note that this idea is beyond parent pom inheritance because all projects inherit from a corporate parent pom. The problem that I am running into is that the corporate parent pom is turning into an "everything but the kitchen sink" POM and I'd like to dissect it into POM fragments relevant for individual modules.

      For example, I would like to have mixins for:

      • Java projects (that include static code analysis plugins, javadoc, etc.)
      • JPA projects (that include DDL generation)
      • Flex projects (that include flexmojos, asdoc, etc.)
      • Scala projects (that include the maven-scala-compiler plugin, scaladoc, etc.)
      • JavaScript projects (that include build plugins like maven-yuicompressor-plugin with jslint and compress goals)

      Hopefully, you get the idea. Without the ability to factor pom logic, we are left with two symptoms:

      1. copy/paste duplication
      2. complex "it does it all" parent poms (which slow down builds because more plugins are loaded even though they might not do anything material)

      Note that a project may include multiple mixins as I could have a project that contains Java code, Scala code, and JavaScript.

      Another idea is that the mixins could be parameterized, so that the ultimate pom can be customized based on the parameters (like tokens).

      I recall reading about Mixins coming in Maven 3.1, but could not find any such issue to watch, so am creating one.

      1. daddy3.zip
        5 kB
        Tony Lampada
      2. maven-tiles.zip
        47 kB
        Maurizio Pillitu

        Issue Links

          Activity

          Anthony Whitford created issue -
          Hide
          Brett Porter added a comment -

          yes, surprisingly there doesn't appear to be an issue for it, though lots of related ones. Adding to that version.

          Show
          Brett Porter added a comment - yes, surprisingly there doesn't appear to be an issue for it, though lots of related ones. Adding to that version.
          Brett Porter made changes -
          Field Original Value New Value
          Fix Version/s 3.1 [ 15565 ]
          Hide
          Brett Porter added a comment -

          I've been in greater need of this lately - I'll kick a discussion on the development list

          Show
          Brett Porter added a comment - I've been in greater need of this lately - I'll kick a discussion on the development list
          Hide
          Maurizio Pillitu added a comment -

          Hi,
          I've some code to share - tested on Maven 3.0.2 - which composes a Maven POM from different tiles; it's a spike of 2 days work, but I think results are very interesting.

          The implementation consists of:

          • an implementation of MavenLifecycleParticipant.java (120 lines)
          • a components.xml

          The attached ZIP file contains a Maven build to produce a JAR that needs to be copied in M2_HOME/lib, a README.txt and a working sample; there are still some issues (e.g. properties inheritance), which are reported in the README, but I think that it gives the idea.

          I really hope this could help with this feature implementation.

          Show
          Maurizio Pillitu added a comment - Hi, I've some code to share - tested on Maven 3.0.2 - which composes a Maven POM from different tiles; it's a spike of 2 days work, but I think results are very interesting. The implementation consists of: an implementation of MavenLifecycleParticipant.java (120 lines) a components.xml The attached ZIP file contains a Maven build to produce a JAR that needs to be copied in M2_HOME/lib, a README.txt and a working sample; there are still some issues (e.g. properties inheritance), which are reported in the README, but I think that it gives the idea. I really hope this could help with this feature implementation.
          Maurizio Pillitu made changes -
          Attachment maven-tiles.zip [ 55249 ]
          Benjamin Bentmann made changes -
          Link This issue relates to MNG-5173 [ MNG-5173 ]
          Hide
          Darren Hartford added a comment -

          Just to make sure there is an appropriate discussion on other points-of-view: as a consumer of different maven plugins/other projects there are times when each individual plugin/project requires a large amount of configuration within the pom (particularly third-party plugins). If mixin is intended to help mitigate this problem, great, just didn't want to assume without asking

          Examples include the maven-gwt-plugin which requires a good amount of configuration, as well as Enunciate. Having those plugins be able to provide example mixin file that only focuses on their particular plugin will avoid a lot of merging problems that usually occur in sometimes very large pom.xml files.

          Show
          Darren Hartford added a comment - Just to make sure there is an appropriate discussion on other points-of-view: as a consumer of different maven plugins/other projects there are times when each individual plugin/project requires a large amount of configuration within the pom (particularly third-party plugins). If mixin is intended to help mitigate this problem, great, just didn't want to assume without asking Examples include the maven-gwt-plugin which requires a good amount of configuration, as well as Enunciate. Having those plugins be able to provide example mixin file that only focuses on their particular plugin will avoid a lot of merging problems that usually occur in sometimes very large pom.xml files.
          Hide
          Tony Lampada added a comment -

          Maurizio, your maven-tiles seems very promising.

          Do you still use it today?
          Have you made any improvements to it?
          By using it, have you bumped into new problems that you haven't thought of?
          How about making it into a github project, or something?

          Show
          Tony Lampada added a comment - Maurizio, your maven-tiles seems very promising. Do you still use it today? Have you made any improvements to it? By using it, have you bumped into new problems that you haven't thought of? How about making it into a github project, or something?
          Hide
          Paul Benedict added a comment - - edited

          Use "import" scope; that's how you can define a POM for particular types of projects (see issue description) and then add those dependencies to your project. I would say the "import" scope is the Mixin you want.

          http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

          Show
          Paul Benedict added a comment - - edited Use "import" scope; that's how you can define a POM for particular types of projects (see issue description) and then add those dependencies to your project. I would say the "import" scope is the Mixin you want. http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
          Hide
          Maurizio Pillitu added a comment -

          @Tony

          • Yes, I still use it sometimes, but being a customisation on the Maven distro (and not a plugin) it is really hard to distribute and build collaboration around it
          • No improvements have been made so far
          • As above, no changes were made, but probably the biggest issue right now is find a way to implement it as a Maven plugin
          • I'm in, will create a github project in the weekend

          @Paul, the Mixin feature aims to inherit <build> behaviours, not (only) dependencies. Read more here http://stackoverflow.com/questions/2456375/how-to-use-maven-3-mixins

          Show
          Maurizio Pillitu added a comment - @Tony Yes, I still use it sometimes, but being a customisation on the Maven distro (and not a plugin) it is really hard to distribute and build collaboration around it No improvements have been made so far As above, no changes were made, but probably the biggest issue right now is find a way to implement it as a Maven plugin I'm in, will create a github project in the weekend @Paul, the Mixin feature aims to inherit <build> behaviours, not (only) dependencies. Read more here http://stackoverflow.com/questions/2456375/how-to-use-maven-3-mixins
          Hide
          Tony Lampada added a comment -

          Dunno.
          IMO, import scope was a very important step for maven as it is a move towards the "favor composition over inheritance" design principle for poms.
          However that limits using composition for project dependencies.

          There's nothing that import scopes can do for me if I want to make a reusable piece of build behaviour, like for example, using the maven-dependency-plugin to unpack a few dependencies during the proccess-resources phase.

          Please see

          Show
          Tony Lampada added a comment - Dunno. IMO, import scope was a very important step for maven as it is a move towards the "favor composition over inheritance" design principle for poms. However that limits using composition for project dependencies. There's nothing that import scopes can do for me if I want to make a reusable piece of build behaviour , like for example, using the maven-dependency-plugin to unpack a few dependencies during the proccess-resources phase. Please see MNG-5127 http://stackoverflow.com/questions/11749375/import-maven-plugin-configuration-by-composition-rather-than-inheritance-can-it http://stackoverflow.com/questions/10245621/how-to-inherit-from-a-multimodule-maven-project-with-all-its-goodies
          Tony Lampada made changes -
          Attachment daddy3.zip [ 61530 ]
          Hide
          Tony Lampada added a comment -

          Now that maven-tiles has been successfully packed as an open source project,
          I made a small project that demonstrates how, using maven-tiles, one can get the desired mixin behaviour.

          See attached daddy3.zip

          Thanks Maurizio!

          Show
          Tony Lampada added a comment - Now that maven-tiles has been successfully packed as an open source project , I made a small project that demonstrates how, using maven-tiles, one can get the desired mixin behaviour. See attached daddy3.zip Thanks Maurizio!
          Brian Fox made changes -
          Comment [ I registered this issue in the "kickstarting" section on FreedomSponsors.
          This means that if you need this issue that bad, you can go to http://www.freedomsponsors.org/core/issue/35/mixin-pom-fragments and throw in a few bucks for it. ]
          stephenconnolly made changes -
          Fix Version/s 3.2 [ 15565 ]
          Fix Version/s Issues to be reviewed for 4.x [ 19871 ]
          Hide
          Roman Arkadijovych Muntyanu added a comment -

          If I'm not mistaken, dependencies mix-ins are implemented as "Grouping Dependencies" ( see http://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html ).
          Is it possible to extend "pom" packaging behaviour beyond dependencies-only? (so that properties, plugin and dependency management sections also became part of the pom depending on mix-in)

          Show
          Roman Arkadijovych Muntyanu added a comment - If I'm not mistaken, dependencies mix-ins are implemented as "Grouping Dependencies" ( see http://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html ). Is it possible to extend "pom" packaging behaviour beyond dependencies-only? (so that properties, plugin and dependency management sections also became part of the pom depending on mix-in)
          Jason van Zyl made changes -
          Component/s FDPFC [ 16560 ]
          Hide
          james strachan added a comment -

          this looks like a possible implementation on 3.x https://github.com/repaint-io/maven-tiles

          Show
          james strachan added a comment - this looks like a possible implementation on 3.x https://github.com/repaint-io/maven-tiles
          Hide
          Christoph Henrici added a comment - - edited

          great, https://github.com/repaint-io/maven-tiles certainly looks like what we need .... i ll try this ..great thx for sharing!!

          Show
          Christoph Henrici added a comment - - edited great, https://github.com/repaint-io/maven-tiles certainly looks like what we need .... i ll try this ..great thx for sharing!!
          paul reeves made changes -
          Attachment daddy-repaintio-tiles.zip [ 66758 ]
          paul reeves made changes -
          Comment [ Tiles example by Tony Lampada, converted to work with repaintio version of the plugin (which is the currently supported version) ]
          paul reeves made changes -
          Attachment daddy-repaintio-tiles.zip [ 66758 ]
          Hide
          Christoph Henrici added a comment -

          Unfortunately does e2Eclipse not work with https://github.com/repaint-io/maven-tiles. It simply ignores it.
          Exactly http://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html is simply not enough. Dependency Management is almost more urgent.

          Show
          Christoph Henrici added a comment - Unfortunately does e2Eclipse not work with https://github.com/repaint-io/maven-tiles . It simply ignores it. Exactly http://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html is simply not enough. Dependency Management is almost more urgent.
          Mark Thomas made changes -
          Project Import Sun Apr 05 08:49:45 UTC 2015 [ 1428223785911 ]
          Mark Thomas made changes -
          Workflow jira [ 12715338 ] Default workflow, editable Closed status [ 12754861 ]
          Mark Thomas made changes -
          Project Import Sun Apr 05 21:45:26 UTC 2015 [ 1428270326204 ]
          Mark Thomas made changes -
          Workflow jira [ 12952444 ] Default workflow, editable Closed status [ 12989787 ]

            People

            • Assignee:
              Unassigned
              Reporter:
              Anthony Whitford
            • Votes:
              42 Vote for this issue
              Watchers:
              39 Start watching this issue

              Dates

              • Created:
                Updated:

                Development