-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
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]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)
iD8DBQFCePtoK3h2CZwO/4URAk95AJ4/goUiAN3zMnWSKbzta7T65CsyJgCZAZMB
T5CKvn+aB7H3WnR35wJbJ/Q=
=DiIK
-----END PGP SIGNATURE-----
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]