-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Alright, this is the part where I print a complete retraction of
everything I just emailed to the list... :)

Next time, I promise, I'll actually re-read the code and/or do some
Right-Click -> References -> Project in Eclipse for a given piece of
code before I shoot my mouth off. In reality, Brett is 100% correct (he
should be, he's looking at the code right now :). Implied plugins like
maven-compiler-plugin will also trigger the configurations in
<pluginManagement/> on a plugin-by-plugin basis. So, in reality, both of
the examples that I gave below will work to configure the compiler plugin.

Sorry for the confusion, and I'll try not to yell my comments in from
the other room next time. :)

john

John Casey wrote:
> I have a refinement or two to this...
> 
> Brett Porter wrote:
> 
>>>John has just made a final fix. So, to summarise the behaviour here:
>>>
>>>- <pluginManagement /> is inherited
>>>- <configuration/> elements are merged together during inheritence
>>>- <plugins/> is NOT inherited
>>>- the final plugin management values are merged into the <plugins/>
>>>element of the POM being built.
> 
> 
> This is critical: the <pluginManagement/> configurations are ONLY
> activated if you declare a corresponding <plugin/> entry in the build
> section's <plugins/> stanza. pluginManagement is an opt-in system; it
> will only affect your build if you specifically invite it in. Also, you
> cannot opt-in for all of the managed configuration at one go.
> 
> To be clear: The only way to use the configuration declared within
> <pluginManagement/> section is to declare a corresponding <plugin/>
> entry within <build><plugins/></build>. The minimal information
> necessary to link a build's actual plugin to the corresponding managed
> plugin information is <groupId/> and <artifactId/>.
> 
> This WILL NOT configure the source/target properties of the
> maven-compiler-plugin:
> 
> <project>
> ...
>   <build>
>     <pluginManagement>
>       <plugins>
>         <plugin>
>           <groupId>org.apache.maven.plugins</groupId>
>           <artifactId>maven-compiler-plugin</artifactId>
>           <version>1.0-alpha-1</version>
>           <configuration>
>             <source>1.5</source>
>             <target>1.5</target>
>           </configuration>
>         </plugin>
>       </plugins>
>     </pluginManagement>
>   </build>
> </project>
> 
> The managed information will ONLY be used when you opt-in for that
> configuration by declaring the plugin for use in the build section, like so:
> 
> <project>
> ...
>   <build>
>     <pluginManagement>
>       <plugins>
>         <plugin>
>           <groupId>org.apache.maven.plugins</groupId>
>           <artifactId>maven-compiler-plugin</artifactId>
>           <version>1.0-alpha-1</version>
>           <configuration>
>             <source>1.5</source>
>             <target>1.5</target>
>           </configuration>
>         </plugin>
>       </plugins>
>     </pluginManagement>
> 
> <!-- THIS IS REQUIRED TO "OPT IN" TO THE MANAGED CONFIGURATION. -->
>     <plugins>
>       <plugin>
>         <groupId>org.apache.maven.plugins</groupId>
>         <artifactId>maven-compiler-plugin</artifactId>
>       </plugin>
>     </plugins>
>   </build>
> </project>
> 
> Looking at this, I'm not 100% convinced that the implicit configuration
> of maven-compiler-plugin is not appropriate...the only question in that
> case is how to undo this configuration, which has the same answer as
> undoing any configuration element: don't put it in the shared
> configuration in the first place. All I'm attempting to do here is
> describe the way the current process functions...this may change in the
> future.
> 
> 
>>>The downside here is that there is no way to exclude something that
>>>has already been declared in a parent. This is intended - if you come
>>>across the situation you can redefine it with a different value, or
>>>you should not inherit the value.
>>>
>>>Why was this chosen, given the downside?
>>>
>>>The downside of going the other direction (where configuration would
>>>completely replace anything given by the inherited version) was much
>>>more confusing: options set for inheritence would have disappeared
>>>from children.
>>>
>>>If anyone has any questions, please say so. J. Matthew Pryor has
>>>volunteered to help document this, so it should be available on the
>>>web site in time.
>>>
>>>Cheers,
>>>Brett
>>>
>>>On 4/28/05, Peter van de Hoef <[EMAIL PROTECTED]> wrote:
>>>
>>>
>>>>Hi John,
>>>>
>>>>I've been away for a while and see that a lot of activity has been going on 
>>>>in the meantime!
>>>>Since I am just an m2 newbee, I cannot oversee if the issues arround 
>>>><plugins> and <pluginManagement> sections have been
>>>>resolved now. So I filed the <pluginManagement> issue anyway 
>>>>(http://jira.codehaus.org/browse/MNG-362). Please ignore it
>>>>if it has already been fixed now.
>>>>
>>>>I will try to build the latest from SVN and perform some tests with my own 
>>>>projects.
>>>>
>>>>Thanks for all the good work.
>>>>Peter van de Hoef
>>>>
>>>>John Casey wrote:
>>>>
>>>
>>>I'm looking at:
>>>
>>>- org.apache.maven.project.inheritance.DefaultModelInheritanceAssembler
>>>- org.apache.maven.project.injection.DefaultModelDefaultsInjector
>>>
>>>and here's what I see:
>>>
>>>- Combination of inherited <pluginManagement/> sections (both parent and
>>>child have <pluginManagement/> stuff defined):
>>>----------------------------------------------------------------------
>>>
>>>Everything is merged, with locally specified elements overriding
>>>ancestor-specified elements in the event of a tie.
>>>
>>>NOTE: There was a problem with the <configuration/> of a plugin not
>>>being merged. I'm fixing this as we speak, although it's not going to be
>>>in alpha-1 obviously... :)
>>>
>>>
>>>
>>>- Combination of local POM's <plugins/> with [inherited]
>>><pluginManagement/> section:
>>>----------------------------------------------------------------------
>>>
>>>HOW IT WORKS: <configuration/> elements (both on <goal/> and on
>>><plugin/>) are combined, with ties going to the local configuration (if
>>>the elements collide, the local specification wins). The list of goals
>>>is accumulated, with the previous note applying to collisions of goals.
>>>That is, if the <pluginManagement/> section specifies some goals and
>>>their configuration for a given plugin, and the <plugin/> section
>>>specifies some goals, the goal definitions from the <pluginManagement/>
>>>section are merged into the one from the plugin specification itself.
>>>
>>>NOTE-TO-SELF: Now that I look at this, it might not be a Good Thing(tm).
>>>For instance, how would I suppress a goal that was declared in
>>><pluginManagement/> but allow other goals from that plugin to run? How
>>>would I suppress plugin configuration declared similarly?
>>>
>>>HOW I'M FIXING IT TO WORK: Any <configuration/> or <goals/> element
>>>specified within a plugin in a local POM will negate the usage of the
>>>corresponding element in the <pluginManagement/> section for that
>>>plugin. This allows users to specify local overrides without having to
>>>deal with the accumulation of common settings which are wrong for the
>>>local case but which are not overridden in the local POM. It also makes
>>>the override mechanism more consistent with <dependencyManagement/>.
>>>
>>>These changes will not be available to -alpha-1, obviously, but should
>>>work on the svn-trunk in a few minutes.
>>>
>>>
>>>Hope this clears things up somewhat. :)
>>>
>>>Cheers,
>>>
>>>-john
>>>
>>>
>>>J. Matthew Pryor wrote:
>>>
>>>
>>>
>>>>>From the docs here
>>>>http://maven.apache.org/maven2/project-descriptor.html#Build about the
>>>><pluginManagement/> element
>>>
>>>>Any local configuration for a given plugin will override the plugin's entire
>>>>definition here.
>>>
>>>>So what constitutes 'local configuration'. If I am to reference the plugin,
>>>>enough to invoke the configuration supplied in a parent <pluginManagement/>,
>>>>how do I do that without overriding the plugin's entire definition?
>>>
>>>>Also am I understanding correctly that <build><plugins/> setting are never
>>>>inherited?
>>>
>>>>BTW I am making good progress writing all this up for the user docs.
>>>>Definitely need this clarification
>>>
>>>>jmp
>>>
>>>
>>>
>>>
>>>>>-----Original Message-----
>>>>>From: Peter van de Hoef [mailto:[EMAIL PROTECTED]
>>>>>Sent: Wednesday, April 27, 2005 6:32 PM
>>>>>To: Maven Users List
>>>>>Subject: Re: [m2] POM inheritance
>>>>>
>>>>>Hi John,
>>>>>
>>>>>Thanks for your help. So <pluginManagement> is used for
>>>>>specifying plugin versions and configuration parameters,
>>>>>whether they are used or not. This will be inherited by child
>>>>>projects. The <plugins> section is just a list of plugins
>>>>>that will actually be used. This list has to be repeated in a
>>>>>child project though, whenever a setting of build-section has
>>>>>to be changed.
>>>>>
>>>>>Now, I have specified a <pluginManagement> section in the
>>>>>parent POM, in the hope that it gets inherited by derived
>>>>>projects, but it does not; in the child project, the java
>>>>>compiler starts complaining about assertions again.
>>>>>
>>>>>The only way to solve this is to repeat myself by inserting a
>>>>>copy of the <pluginManagement> section of the parent into the child.
>>>>>
>>>>>If I look at 'DefaultModelInheritanceAssembler.java' it
>>>>>appears that the assemblePluginManagementInheritance()
>>>>>function correctly takes care of <pluginManagement> sections
>>>>>of the parent.
>>>>>What is going wrong here? Did I miss something in the project defs?
>>>>>
>>>>>The parent POM looks like:
>>>>>
>>>>><project>
>>>>>
>>>>>   <name>Parent POM</name>
>>>>>
>>>>>   <groupId>_test</groupId>
>>>>>   <artifactId>parent</artifactId>
>>>>>   <version>1.0</version>
>>>>>   <packaging>pom</packaging>
>>>>>
>>>>>   <modules>
>>>>>           <module>child</module>
>>>>>   </modules>
>>>>>
>>>>>   <build>
>>>>>           <sourceDirectory>src</sourceDirectory>
>>>>>
>>>>>           <pluginManagement>
>>>>>                   <plugins>
>>>>>                           <plugin>
>>>>>
>>>>><groupId>org.apache.maven.plugins</groupId>
>>>>>
>>>>><artifactId>maven-compiler-plugin</artifactId>
>>>>>
>>>>><version>1.0-alpha-2-SNAPSHOT</version>
>>>>>                                   <configuration>
>>>>>                                           <source>1.5</source>
>>>>>                                           <target>1.5</target>
>>>>>                                   </configuration>
>>>>>                           </plugin>
>>>>>                   </plugins>
>>>>>           </pluginManagement>
>>>>>
>>>>>           <plugins>
>>>>>                   <plugin>
>>>>>
>>>>><groupId>org.apache.maven.plugins</groupId>
>>>>>
>>>>><artifactId>maven-compiler-plugin</artifactId>
>>>>>                   </plugin>
>>>>>           </plugins>
>>>>>   </build>
>>>>>
>>>>></project>
>>>>>
>>>>>And the child, which inherits from the parent:
>>>>>The <build> section is overridden with a different
>>>>><sourceDirectory> and, since the <plugins> of the parent gets
>>>>>lost, it is repeated.
>>>>>
>>>>><project>
>>>>>
>>>>>   <name>Child POM</name>
>>>>>
>>>>>   <groupId>_test</groupId>
>>>>>   <artifactId>child</artifactId>
>>>>>   <version>1.0</version>
>>>>>   <packaging>pom</packaging>
>>>>>
>>>>>   <parent>
>>>>>           <groupId>_test</groupId>
>>>>>           <artifactId>parent</artifactId>
>>>>>           <version>1.0</version>
>>>>>   </parent>
>>>>>
>>>>>   <build>
>>>>>           <sourceDirectory>src2</sourceDirectory>
>>>>>           <plugins>
>>>>>                   <plugin>
>>>>>
>>>>><groupId>org.apache.maven.plugins</groupId>
>>>>>
>>>>><artifactId>maven-compiler-plugin</artifactId>
>>>>>                   </plugin>
>>>>>           </plugins>
>>>>>   </build>
>>>>></project>
>>>>>
>>>>>Thanks in advance,
>>>>>Peter van de Hoef
>>>>>
>>>>>John Casey wrote:
>>>>>
>>>
>>>>Sorry, I forgot all about the design decisions surrounding
>>>
>>>
>>>>>>this... :)
>>>
>>>
>>>>Actually, our original decision was to disallow inheritance of any
>>>>plugin configuration, since plugin configuration can (and usually
>>>>will) modify the build lifecycle for that project. In light
>>>
>>>
>>>>>>of this,
>>>
>>>
>>>>inherited plugin configuration could lead to somewhat
>>>>counter-intuitive build behavior.
>>>
>>>>We have a <pluginManagement/> section of the POM for common
>>>>configuration of plugins for use within a typical
>>>
>>>
>>>>>>multiproject-style
>>>
>>>
>>>>setup. It would be used like this:
>>>
>>>>parent-pom.xml
>>>>-------------------
>>>>...
>>>><pluginManagement>
>>>>  <plugins>
>>>>    <plugin>
>>>>      <groupId>org.apache.maven.plugin</groupId>
>>>>      <artifactId>maven-something-plugin</artifactId>
>>>>      <version>1.4</version>
>>>>      <configuration>
>>>>        <someParam>someValue</someParam>
>>>>      </configuration>
>>>>    </plugin>
>>>>  </plugins>
>>>></pluginManagement>
>>>>...
>>>>-------------------
>>>
>>>>child-pom.xml
>>>>-------------------
>>>>...
>>>><parent>
>>>>  <groupId>test</groupId>              <!-- Pretend that all of
>>>>  <artifactId>test-root</artifactId>    | this resolves to the
>>>>  <version>1.0</version>                | parent-pom.xml above -->
>>>></parent>
>>>>...
>>>><build>
>>>>  <plugins>
>>>>    <plugin>
>>>>      <groupId>org.apache.maven.plugin</groupId>
>>>
>>>>>><!-- groupId,
>>>
>>>
>>>>      <artifactId>maven-something-plugin</artifactId>  |
>>>
>>>
>>>>>>artifactId
>>>
>>>
>>>>    </plugin>                                          |
>>>
>>>
>>>>>>enough here.
>>>
>>>
>>>>                                                       -->
>>>></build>
>>>>...
>>>>-------------------
>>>
>>>>If you need to override some setting from the pluginManagement
>>>>section, just specify it locally; more local specification in an
>>>>inheritance hierarchy wins.
>>>
>>>>Will this solve your problem?
>>>
>>>>HTH,
>>>
>>>>john
>>>
>>>
>>>>Peter van de Hoef wrote:
>>>
>>>
>>>
>>>
>>>>>Thanks for your reply.
>>>>>Now I see why the complete <build> section is inherited when it is
>>>>>absent in the child:
>>>
>>>>>   *if* ( childBuild == *null* )
>>>>>   {
>>>>>       child.setBuild( parentBuild );
>>>>>   }
>>>>>   *else*
>>>>>   {
>>>>>       /// A lot of fields are inherited, except <plugins>
>>>>>/        }
>>>
>>>>>I understand that inheriting plugins is problematic, since
>>>>>
>>>>>
>>>>>
>>>>>>Maven does
>>>
>>>>>not 'know' about the plugin parameters and cannot decide their
>>>>>inheritance rules.
>>>>>Wouldn't it be possible to inherit the complete <plugins>
>>>>>
>>>>>>section if
>>>
>>>>>it is not specified in the child, just like you do with <resources>
>>>>>and <testResources>?
>>>>>That seems IMHO more in line with the situation where there is no
>>>>><build> section at all. In that way it is possible to 'tweak' the
>>>>>build settings slightly without losing the major build logic.
>>>>>- Peter
>>>
>>>>>Jason van Zyl wrote:
>>>
>>>
>>>
>>>>>>On Tue, 2005-04-26 at 21:00 +0200, Peter van de Hoef wrote:
>>>
>>>
>>>
>>>
>>>
>>>
>>>>>>>Hi all,
>>>
>>>>>>>I have a question about which elements of the POM are
>>>
>>>>>>inherited by
>>>
>>>
>>>
>>>>>>>derived POM's.
>>>>>>>
>>>
>>>
>>>>>>The law on inheritance resides here:
>>>
>>>>>>http://svn.apache.org/viewcvs.cgi/maven/components/trunk/maven-
>>>>>>project/src/main/java/org/apache/maven/project/inheritance/
>>>
>>>>>>DefaultMod
>>>
>>>>>>elInheritanceAssembler.java?rev=164217&sortdir=down&view=log
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>>>>>In my parent POM I have a <build> section which specifies
>>>
>>>>>>the source
>>>
>>>
>>>
>>>>>>>directory and some parameters for the java compiler:
>>>
>>>>>>><build>
>>>>>>>   <sourceDirectory>src</sourceDirectory>
>>>>>>>   <plugins>
>>>>>>>       <plugin>
>>>>>>>           <groupId>org.apache.maven.plugins</groupId>
>>>>>>>           <artifactId>maven-compiler-plugin</artifactId>
>>>>>>>           <version>1.0-alpha-2-SNAPSHOT</version>
>>>>>>>           <configuration>
>>>>>>>               <source>1.5</source>
>>>>>>>               <target>1.5</target>
>>>>>>>           </configuration>
>>>>>>>       </plugin>
>>>>>>>   </plugins>
>>>>>>></build>
>>>
>>>>>>>In a derived POM, the source directoriy is different, so a new
>>>>>>><build> section is specified:
>>>
>>>>>>><build>
>>>>>>>   <sourceDirectory>module/src</sourceDirectory>
>>>>>>></build>
>>>
>>>>>>>The overridden source directory is effectuated in this
>>>
>>>>>>second POM,
>>>
>>>
>>>
>>>>>>>but it appears that  the java compiler settings have
>>>
>>>>>>disappeared (it
>>>
>>>
>>>
>>>>>>>starts e.g. complaining about JDK 1.4 features like
>>>
>>>>>>assertions). If
>>>
>>>
>>>
>>>>>>>I do not specify a <build> section in the derived POM,
>>>
>>>>>>the settings
>>>
>>>
>>>
>>>>>>>of the base POM are inherited.
>>>
>>>>>>>It appears that the <build> section is (completely)
>>>
>>>>>>inherited if it
>>>
>>>
>>>
>>>>>>>is not present in the derived POM, but if a <build> section is
>>>>>>>specified in the derived POM, everything from the base
>>>
>>>>>>POM is thrown
>>>
>>>
>>>
>>>>>>>away and only the settings of the derived POM are used.
>>>>>>>Is this correct?
>>>>>>>
>>>
>>>
>>>>>>We selectively choose what to inherit and the
>>>
>>>>>>configuration for the
>>>
>>>>>>plug-ins are a little trickier because they free form
>>>
>>>>>>configurations
>>>
>>>>>>essentially. We need to do a more careful merge of the
>>>
>>>>>>configurations
>>>
>>>>>>but this might not work generally so if we need to allow
>>>
>>>>>>the plugin
>>>
>>>>>>to determine how a configuration should be inherited then we'll
>>>>>>probably have to come up with some way to decide this
>>>
>>>>>>using notations
>>>
>>>>>>we have for plugins. Anyway, I see you posted a JIRA issue
>>>
>>>>>>so we'll
>>>
>>>>>>take a look at it.
>>>
>>>
>>>
>>>
>>>>>------------------------------------------------------------
>>>>>
>>>>>
>>>>>
>>>>>>---------
>>>
>>>>>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]
>>>
>>>
>>>
>>>
>>>
>>>
>>>>>---------------------------------------------------------------------
>>>>>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]
>>>
>>>
>>>
>>>
> 
> ---------------------------------------------------------------------
> 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]
>>>>
>>>>
> 
> 
> 
>>>---------------------------------------------------------------------
>>>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]



-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)

iD8DBQFCeP/jK3h2CZwO/4URArckAJ9Lv8DBo65+87mwf6jAKtSk7acbPwCeJ6I2
H1xB7lP+X2nSRxzimJOJO24=
=XWhd
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to