Search code examples
mavenmaven-3maven-plugin

How does Maven resolve plugin versions?


I'm reading the docs and still confused as to how Maven is deciding which versions of plugins to download.

For example, consider this simple scenario:

  1. an empty local repository
  2. a default settings.xml
  3. run a simple maven command. for example, mvn archetype:generate for the maven-archetype-quickstart as described in the Maven in 5 Minutes doc.

After running the command, the first thing Maven does is download a bunch of plugins.

Some of the plugins Maven is downloading include:

  • maven-clean-plugin-2.4.1
  • maven-install-plugin-2.3.1
  • maven-deploy-plugin-2.5

Why those versions?

The most recent version of these plugins are:

  • maven-clean-plugin-2.5
  • maven-install-plugin-2.5.1
  • maven-deploy-plugin-2.8.1

I looked at the LATEST version metadata for maven-clean-plugin and it's 2.5

It's not that I necessarily want to force Maven to use different versions of these plugins, I just want to understand WHY it's resolving to those versions.

I'm using Apache Maven 3.0.3


Solution

  • Maven defines 3 lifecycles in META-INF/plexus/components.xml:

    1. Default Lifecycle

    Default lifecycle are defined without any associated plugin. Plugin bindings for these lifecycles are defined separately for every packaging in META-INF/plexus/default-bindings.xml

    e.g. Plugin bindings for jar packaging

    <phases>
      <process-resources>
        org.apache.maven.plugins:maven-resources-plugin:2.6:resources
      </process-resources>
      <compile>
        org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile
      </compile>
      <process-test-resources>
        org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
      </process-test-resources>
      <test-compile>
        org.apache.maven.plugins:maven-compiler-plugin:2.5.1:testCompile
      </test-compile>
      <test>
        org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
      </test>
      <package>
        org.apache.maven.plugins:maven-jar-plugin:2.4:jar
      </package>
      <install>
        org.apache.maven.plugins:maven-install-plugin:2.4:install
      </install>
      <deploy>
        org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
      </deploy>
    </phases>
    

    2. Clean Lifecycle clean lifecycle is defined directly with its plugin bindings.

    <phases>
      <phase>pre-clean</phase>
      <phase>clean</phase>
      <phase>post-clean</phase>
    </phases>
    <default-phases>
      <clean>
        org.apache.maven.plugins:maven-clean-plugin:2.5:clean
      </clean>
    </default-phases>
    

    3. Site Lifecycle Site lifecycle is defined directly with its plugin bindings.

    <phases>
      <phase>pre-site</phase>
      <phase>site</phase>
      <phase>post-site</phase>
      <phase>site-deploy</phase>
    </phases>
    <default-phases>
      <site>
        org.apache.maven.plugins:maven-site-plugin:3.3:site
      </site>
      <site-deploy>
        org.apache.maven.plugins:maven-site-plugin:3.3:deploy
      </site-deploy>
    </default-phases>
    

    If you want to override these default plugin version you can do it from command prompt as follows

    mvn org.apache.maven.plugins:maven-clean-plugin:2.0:clean
    

    instead of

    mvn clean:clean