Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maven pluginManagement configuration inheritance strange behavior

I'm using pluginManagement element in my parent pom.xml to configure plugins for all its children. For example, I have the following configuration:

<pluginManagement>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
            <execution>
                <id>copy-artifacts</id>
                <phase>install</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>some/where/else</outputDirectory>
                    <resources>
                        <resource>
                            <directory>some/another/resource</directory>
                        </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.4</version>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>install</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>deps/dir</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>
</pluginManagement>

The official documentation states that a plugin configured in pluginManagement still has to be added to plugins element in children poms. Indeed, if I remove this from child pom:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
</plugin>

then maven-dependency-plugin stops firing at install phase. However, it seems that it does not affect some other plugins, namely, maven-resource-plugin. Even if I do not have

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
</plugin>

in my child pom, its copy-resources goal still fires at install phase and performs the work it is configured to do.

Why is this behavior present? Is there a list of plugins which are inherited always, or maybe I'm missing something?

like image 537
Vladimir Matveev Avatar asked Oct 02 '12 12:10

Vladimir Matveev


People also ask

What is pluginManagement in Maven?

From Maven documentation: pluginManagement: is an element that is seen along side plugins. Plugin Management contains plugin elements in much the same way, except that rather than configuring plugin information for this particular project build, it is intended to configure project builds that inherit from this one.

What do child poms inherit from the parent pom?

Now child POM need to refer the parent POM using parent tag and specifying groupId/artifactId/version attributes. This pom file will inherit all properties and dependencies from parent POM and additionally can include extra sub-project specific dependencies as well.


2 Answers

The whole POM isn't visible; but given the behavior you're describing this is a jar, war, or ear, correct? The resource plugin is defined for those packaging types by default. It includes an execution that copies resources (as described by @maba).

Since the plugin definition is included in your child POM (even though YOU didn't put it there directly), Maven merges the execution defined in the <pluginManagement> section with the execution provided by Maven.

There is documentation describing the default lifecycle bindings by packaging type. Note the dependency plugin isn't mentioned; but resources is; that's why you observe the difference. Running with -X will show the plugin executions.

like image 100
user944849 Avatar answered Oct 13 '22 05:10

user944849


Maven always copies resources that are inside src/main/resources by default.

From Maven Getting Started Guide:

The simple rule employed by Maven is this: any directories or files placed within the ${basedir}/src/main/resources directory are packaged in your JAR with the exact same structure starting at the base of the JAR.

like image 1
maba Avatar answered Oct 13 '22 06:10

maba