Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

M2E plugin execution not covered

Revision as of 15:05, 7 September 2011 by Matthew.piggott.ca (Talk | contribs) (Removed comments, take to the discussion page)


Background

m2eclipse 0.12 and earlier executed some parts of Maven build lifecycle inside Eclipse and then configured the Eclipse project based on after-execution state collected in MavenProject. This was controlled by many different sets of maven goals -- goals when projects were imported, project configuration changes and workspace full and incremental builds. Some of these goals were configured at workspace level, some in project/.settings. On top of that, there was project-level setting to "skip" maven-compiler-plugin execution.

Unfortunately, this did not work well or not at all for many projects. Probably even worse, it did not *always* work for many projects, so we had to go through series of refresh/update dependencies/update configuration/rebuild voodoo (or "m2eclipse dance" as some called it) to get projects in a good state. For example MNGECLIPSE-823 was the most voted issue in m2e jira and it was a direct manifestation of this "flakiness".

Most, if not all, such problems were traced back to one of two root causes. 1. Out-of-workspace resource changes made by Maven plugin triggered unexpected workspace builds. This was very indeterministic. In some cases projects appeared to work fine. In some cases, generated/filtered resources would go missing. And in some cases workspace build would go on forever. 2. Various JVM and OS resources leaks by Maven plugins was another common cause of problems.

To solve these long-standing issues, m2e 1.0 requires explicit instructions what to do with all Maven plugins bound to "interesting" phases (see M2E interesting lifecycle phases) of a project build lifecycle. We call these instructions "project build lifecycle mapping" or simply "lifecycle mapping" because they define how m2e maps information from project pom.xml file to Eclipse workspace project configuration and behaviour during Eclipse workspace build.

Project build lifecycle mapping can be configured in a project's pom.xml, contributed by Eclipse plugins, or defaulted to the commonly used Maven plugins shipped with m2e. We call these "lifecycle mapping metadata sources". m2e will create error marker like below for all plugin executions that do not have lifecycle mapping in any of the mapping metadata sources.

Plugin execution not covered by lifecycle configuration:
org.apache.maven.plugins:maven-antrun-plugin:1.3:run
    (execution: generate-sources-input, phase: generate-sources)

m2e matches plugin executions to actions using combination of plugin groupId, artifactId, version range and goal. There are three basic actions that m2e can be instructed to do with a plugin execution -- ignore, execute and delegate to a project configurator.

delegate to a project configurator (recommended)

configurator mapping tells m2e to delegate workspace project configuration mapping for matching plugin execution to an implementation of AbstractProjectConfigurator registered with m2e using projectConfigurators extension point.

In most cases configurator mapping will be used by m2e extension developers. See M2E Extension Development wiki page for more information about developing m2e extensions.

ignore plugin goal

ignore, as the name suggests, tells m2e to silently ignore the plugin execution. Here is sample pom.xml snippet

   <pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.eclipse.m2e</groupId>
      <artifactId>lifecycle-mapping</artifactId>
      <version>1.0.0</version>
      <configuration>
        <lifecycleMappingMetadata>
          <pluginExecutions>
            <pluginExecution>
              <pluginExecutionFilter>
                <groupId>some-group-id</groupId>
                <artifactId>some-artifact-id</artifactId>
                <versionRange>[1.0.0,)</versionRange>
                <goals>
                  <goal>some-goal</goal>
                </goals>
              </pluginExecutionFilter>
              <action>
                <ignore />
              </action>
            </pluginExecution>
          </pluginExecutions>
        </lifecycleMappingMetadata>
      </configuration>
    </plugin>
  </plugins>
</pluginManagement>


HINT: m2e provides a quick-fix associated with "plugin execution not covered" to easily create <pluginManagement/> elements like above.

execute plugin goal

execute tells m2e to execute the action as part of Eclipse workspace full or incremental build. Beware that m2e does not provide any safeguards against rogue maven plugins that leak classloaders, modify random files inside workspace or throw nasty exceptions to fail the build. Use this as the last resort and make sure you know what you are doing.

   <pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.eclipse.m2e</groupId>
      <artifactId>lifecycle-mapping</artifactId>
      <version>1.0.0</version>
      <configuration>
        <lifecycleMappingMetadata>
          <pluginExecutions>
            <pluginExecution>
              <pluginExecutionFilter>
                <groupId>some-group-id</groupId>
                <artifactId>some-artifact-id</artifactId>
                <versionRange>[1.0.0,)</versionRange>
                <goals>
                  <goal>some-goal</goal>
                </goals>
              </pluginExecutionFilter>
              <action>
                <execute />
              </action>
            </pluginExecution>
          </pluginExecutions>
        </lifecycleMappingMetadata>
      </configuration>
    </plugin>
  </plugins>
</pluginManagement>


HINT: use quick fix to create "ignore" mapping, then replace <ignore/> action with <execute/>

metadata source lookup order

m2e considers lifecycle mapping metadata sources in the following order

  1. pom.xml file of the project
  2. parent, grand-parent and so on pom.xml files
  3. installed m2e extensions (in no particular order)
  4. default lifecycle mapping metadata shipped with m2e

m2e uses the first applicable mapping found.

m2e maven plugin coverage status

groupId artifactId version range goals status
org.antlr antlr3-maven-plugin [3.1.1,) antlr org.sonatype.m2e.antlr
org.apache.maven.plugins maven-jar-plugin [2.0) jar org.sonatype.m2e.mavenarchiver.pomProperties
org.codehaus.modello modello-maven-plugin [1.0.1,) java
xpp3-reader
xpp3-writer
xpp3-extended-reader
xsd
stax-reader
org.sonatype.m2e.modello
org.codehaus.mojo antlr-maven-plugin [2.1,) generate org.sonatype.m2e.antlr
org.codehaus.mojo build-helper-maven-plugin [1.0,) add-source
add-test-source
org.sonatype.m2e.buildhelper
org.codehaus.plexus plexus-component-metadata [1.0-beta-3.0.6,) generate-metadata
generate-test-metadata
org.sonatype.m2e.plexus.annotations
org.codehaus.plexus plexus-maven-plugin [1.1,) descriptor
test-descriptor
merge-descriptors
test-merge-descriptors
not supported

Help improve m2e maven plugin coverage

First and foremost, you need to understand the desired behaviour. In most cases this should be limited to IDE usecase, i.e. editing sources and running tests, and not the complete Maven build, so plugin goals that publish build results to a remote repository can be ignored without any adverse side effects, while java source code generation most likely is necessary.

If the desired behaviour is applicable to other Maven projects using the plugin goal, we strongly recommend documenting your findings in m2e bugzilla. Please use "[mojo] plugin-artifact-id:goal support" bugzilla summary and make sure to search for existing records. When submitting new request, please provide standalone example project and detailed description of desired behaviour when the project is imported in Eclipse workspace. This will allow other users and interested developers to track popularity of various Maven plugins and schedule implementation work accordingly.

M2E Extension Development has pointers how to develop m2e extensions.

Common problems

Some Maven plugins are recognized as problematic and will produce error markers with a text similar to: maven-dependency-plugin (goals "copy-dependencies","unpack") is not supported by m2e

In version 1.0 there is no quick fix available for this but it is possible to define a lifecycle mapping for the plugin as well (as shown in ignore plugin goal above). Which removes the error marker.

Back to the top