We have a lifecycle mapping for the packaging of *jar* below. You see that for this packaging we have a *default* lifecycle and a list of phases where each phase is a comma separated list of goals to run and they are in the form groupId:artifactId:version.
default
org.apache.maven.plugins:maven-resources-plugin:resources
org.apache.maven.plugins:maven-compiler-plugin:compile
org.apache.maven.plugins:maven-resources-plugin:testResources
org.apache.maven.plugins:maven-compiler-plugin:testCompile
org.apache.maven.plugins:maven-surefire-plugin:test
org.apache.maven.plugins:maven-jar-plugin:jar
org.apache.maven.plugins:maven-install-plugin:install
org.apache.maven.plugins:maven-deploy-plugin:deploy
We need to turn this list of phases into a set of plugin objects that have an xml representation like the following:
org.apache.maven.plugins
maven-resources-plugin
process
.
.
.
We need this form so that the model builder can make the first pass at merging. Full merging cannot be done because we don't know what the version of the plugin is yet that the user has requested. For plugins in the default lifecycle they are typically defined in the plugin management section of the parent POM. When the merging is complete we are going to have something that looks like the following:
org.apache.maven.plugins
maven-resources-plugin
1.0
process
.
.
.
Once we have the version of the plugins the appropriate call to the plugin manager can be made to get the MojoDescriptor for the goal that needs to be run. In the MojoDescriptor we are interested in the element and element. From these elements we need to make a component configuration for the MojoExecution. The actual DOM like structure we create is of type PlexusConfiguration and is the type we use with the ComponentConfigurator to initialize fields in a Plexus component. Typically this is done within Plexus with the configuration supplied with component configuration, but in Maven we take configuration values from the POM. So we have to use the ComponentConfigurator outside of Plexus in order to configure the Maven Mojo which is just a Plexus component. We can use the information from the MojoDescriptor along with the merged configuration information that is now present in the POM to create the complete PlexusConfiguration used to populate values in the Maven Mojo.
foreach configuration element:
- if read only and being set squawk
- find the parameter
- get value from expression or default
- if required and null squawk
${localRepository}
${project.resources}
${project.repositories}
${project.remoteArtifactRepositories}
${basedir}/src/main/appended-resources
${excludeScope}
${includeScope}
${excludeGroupIds}
${remoteresources.skip}
${project.build.directory}/maven-shared-archive-resources
${excludeArtifactIds}
${excludeTransitive}
${includeGroupIds}
${session}
${project}
${includeArtifactIds}
appendedResourcesDirectory
java.io.File
false
true
attached
boolean
false
true
excludeArtifactIds
java.lang.String
false
true
excludeGroupIds
java.lang.String
false
true
excludeScope
java.lang.String
false
true
excludeTransitive
boolean
false
true
includeArtifactIds
java.lang.String
false
true
includeGroupIds
java.lang.String
false
true
includeScope
java.lang.String
false
true
localRepository
org.apache.maven.artifact.repository.ArtifactRepository
true
false
mavenSession
org.apache.maven.execution.MavenSession
true
false
The Maven session.
outputDirectory
java.io.File
false
true
project
org.apache.maven.project.MavenProject
true
false
properties
java.util.Map
false
true
remoteArtifactRepositories
java.util.List
true
false
repositories
java.util.List
true
false
resourceBundles
java.util.List
true
true
resources
java.util.List
true
false
skip
boolean
false
true
supplementalModels
java.lang.String[]
false
true
- we need to know what came from the POM, and validate those
- plugin in any default values
- check to see if anything is missing
In the case of something like Modello where it is common to specify the configuration for all the goals outside the execution block we need to account for creating the right configuration element which includes only those configuration elements for a particular goal that that particular goal understands. We need to walk through the parameters of the Mojo in question and only take the configuration options that apply.