Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 700
Justin Avatar asked Jan 15 '14 03:01

Justin


People also ask

What is the use of versions Maven plugin?

The Versions Plugin is used when you want to manage the versions of artifacts in a project's POM.

What is plugin version?

A Plugin Version contains all the information about a particular version of a Plugin. Some notable fields include the URL to the plugin package, the version number and what plugin is it the version of.

Does Maven allow third party plugins?

However, as previously mentioned, the user may have a need for third-party plugins. Since the Maven project is assumed to have control over the default plugin groupId, this means configuring Maven to search other groupId locations for plugin-prefix mappings. As it turns out, this is simple.


1 Answers

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
like image 130
Ashay Batwal Avatar answered Sep 29 '22 18:09

Ashay Batwal