Skip to content

Maven 4 ignores <default-phases> from components.xml for standard lifecycle phases #11796

@mariuszs

Description

@mariuszs

Description

When a Maven plugin registers a custom lifecycle via META-INF/plexus/components.xml with <default-phases> binding goals to standard lifecycle phases (e.g. process-sources), Maven 4 loads the custom lifecycle but does not apply the default phase bindings. The same plugin works correctly on Maven 3.

This is different from MNG-8299 which tests custom phase names invoked directly (mvn phase3). This issue is about binding plugin goals to standard default lifecycle phases via <extensions>true</extensions>.

Steps to reproduce

Minimal reproducer: https://github.com/mariuszs/extension-maven-plugin

  1. Clone the repo
  2. mvn install -DskipTests
  3. Run the extension-it test project:
cd src/it/extension-it
# substitute template variables
sed 's/@project.groupId@/com.skillpanel/;s/@project.artifactId@/extension-maven-plugin/;s/@project.version@/1.0-SNAPSHOT/' pom.xml > /tmp/test-pom.xml
mvn compile -f /tmp/test-pom.xml
  1. Check for target/touch.txt — it should exist but doesn't on Maven 4.

The plugin's components.xml:

<component-set>
  <components>
    <component>
      <role>org.apache.maven.lifecycle.Lifecycle</role>
      <implementation>org.apache.maven.lifecycle.Lifecycle</implementation>
      <role-hint>extension-maven-plugin</role-hint>
      <configuration>
        <id>extension-maven-plugin</id>
        <phases>
          <phase>extension-not-used-phase</phase>
        </phases>
        <default-phases>
          <process-sources>
            com.skillpanel:extension-maven-plugin:touch
          </process-sources>
        </default-phases>
      </configuration>
    </component>
  </components>
</component-set>

The consuming project POM (no <executions> needed — extensions handle binding):

<plugin>
  <groupId>com.skillpanel</groupId>
  <artifactId>extension-maven-plugin</artifactId>
  <version>1.0-SNAPSHOT</version>
  <extensions>true</extensions>
</plugin>

Expected behavior

On Maven 3.9.x: the touch goal is automatically bound to process-sources phase via <default-phases>. Running mvn compile produces target/touch.txt.

[INFO] --- extension:1.0-SNAPSHOT:touch (default-touch) @ extension-it ---

Actual behavior

On Maven 4.0.0-rc-5: the custom lifecycle is loaded but <default-phases> bindings are not applied. Debug log shows:

[DEBUG] Lifecycle extension-maven-plugin -> [extension-not-used-phase]

Only the dummy phase is visible — no goal bindings to process-sources. The touch goal never executes, target/touch.txt is not created.

Environment

  • Maven 4.0.0-rc-5
  • Maven 3.9.13 (works correctly)
  • Java 25 (also reproduced on Java 17)
  • Linux

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions