o created an execution plan which currently contains the mojos that will be executed and the phase of dependency resolution required, if needed

git-svn-id: https://svn.apache.org/repos/asf/maven/components/branches/MNG-2766@778284 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jason van Zyl 2009-05-25 05:26:27 +00:00
parent c3f3d4c30c
commit 5b76c2c495
6 changed files with 346 additions and 261 deletions

368
build.xml
View File

@ -7,7 +7,7 @@ to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
@ -31,210 +31,210 @@ END SNIPPET: ant-bootstrap -->
<project default="all" basedir="." xmlns:artifact="urn:maven-artifact-ant">
<property name="it.workdir.version" value="3.0.x"/>
<property name="it.workdir.version" value="3.0.x"/>
<target name="initTaskDefs">
<xmlproperty file="pom.xml" prefix="pom.xml" />
<path id="maven-ant-tasks.classpath" path="maven-ant-tasks-2.1-SNAPSHOT.jar"/>
<typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant" classpathref="maven-ant-tasks.classpath"/>
</target>
<target name="initTaskDefs">
<xmlproperty file="pom.xml" prefix="pom.xml" />
<path id="maven-ant-tasks.classpath" path="maven-ant-tasks-2.1-SNAPSHOT.jar"/>
<typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant" classpathref="maven-ant-tasks.classpath"/>
</target>
<target name="isMavenHomeSet" depends="initTaskDefs">
<property environment="env"/>
<condition property="maven.home" value="${env.M2_HOME}">
<isset property="env.M2_HOME"/>
</condition>
<fail message="You must set the M2_HOME environment variable or specify a maven.home property to this Ant script">
<condition>
<or>
<not>
<isset property="maven.home" />
</not>
<equals arg1="${maven.home}" arg2="" trim="true" />
</or>
</condition>
</fail>
</target>
<target name="isMavenHomeSet" depends="initTaskDefs">
<property environment="env"/>
<condition property="maven.home" value="${env.M2_HOME}">
<isset property="env.M2_HOME"/>
</condition>
<fail message="You must set the M2_HOME environment variable or specify a maven.home property to this Ant script">
<condition>
<or>
<not>
<isset property="maven.home" />
</not>
<equals arg1="${maven.home}" arg2="" trim="true" />
</or>
</condition>
</fail>
</target>
<target name="init" depends="isMavenHomeSet">
<xmlproperty prefix="pom" file="pom.xml"/>
<dirname file="${maven.home}" property="maven.home.dirname"/>
<!-- Initialize properties -->
<property name="maven.home.basename.expected" value="apache-maven-${pom.project.version}"/>
<property name="maven.home.effective" location="${maven.home.dirname}/${maven.home.basename.expected}"/>
<property name="maven.assembly" location="apache-maven/target/${maven.home.basename.expected}-bin.zip"/>
<property name="maven.repo.local" value="${user.home}/.m2/repository"/>
<property name="maven.debug" value="-e"/>
<property name="maven.test.skip" value="true"/> <!-- TODO: Change this default back to false once we're done -->
<property name="surefire.useFile" value="true"/>
<echo>maven.home = ${maven.home.effective}</echo>
<echo>maven.repo.local = ${maven.repo.local}</echo>
</target>
<target name="init" depends="isMavenHomeSet">
<xmlproperty prefix="pom" file="pom.xml"/>
<dirname file="${maven.home}" property="maven.home.dirname"/>
<!-- Initialize properties -->
<property name="maven.home.basename.expected" value="apache-maven-${pom.project.version}"/>
<property name="maven.home.effective" location="${maven.home.dirname}/${maven.home.basename.expected}"/>
<property name="maven.assembly" location="apache-maven/target/${maven.home.basename.expected}-bin.zip"/>
<property name="maven.repo.local" value="${user.home}/.m2/repository"/>
<property name="maven.debug" value="-e"/>
<property name="maven.test.skip" value="false"/> <!-- TODO: Change this default back to false once we're done -->
<property name="surefire.useFile" value="true"/>
<echo>maven.home = ${maven.home.effective}</echo>
<echo>maven.repo.local = ${maven.repo.local}</echo>
</target>
<target name="clean-bootstrap" description="cleans up generated bootstrap classes">
<delete dir="bootstrap"/>
</target>
<target name="clean-bootstrap" description="cleans up generated bootstrap classes">
<delete dir="bootstrap"/>
</target>
<target name="pull" depends="init" unless="skip.pull">
<property name="verbose" value="false"/>
<!-- Pull the dependencies that Maven needs to build -->
<copy file="pom.xml" tofile="dependencies.xml"/>
<replace file="${basedir}/dependencies.xml" token="&lt;!--bootstrap-start-comment--&gt;" value="&lt;!--"/>
<replace file="${basedir}/dependencies.xml" token="&lt;!--bootstrap-end-comment--&gt;" value="--&gt;"/>
<artifact:pom file="${basedir}/dependencies.xml" id="pom"/>
<artifact:dependencies pathId="pom.pathid" filesetId="pom.fileset" verbose="${verbose}" useScope="compile">
<localRepository path="${maven.repo.local}"/>
<pom refid="pom"/>
</artifact:dependencies>
<delete file="${basedir}/dependencies.xml"/>
<target name="pull" depends="init" unless="skip.pull">
<property name="verbose" value="false"/>
<!-- Pull the dependencies that Maven needs to build -->
<copy file="pom.xml" tofile="dependencies.xml"/>
<replace file="${basedir}/dependencies.xml" token="&lt;!--bootstrap-start-comment--&gt;" value="&lt;!--"/>
<replace file="${basedir}/dependencies.xml" token="&lt;!--bootstrap-end-comment--&gt;" value="--&gt;"/>
<artifact:pom file="${basedir}/dependencies.xml" id="pom"/>
<artifact:dependencies pathId="pom.pathid" filesetId="pom.fileset" verbose="${verbose}" useScope="compile">
<localRepository path="${maven.repo.local}"/>
<pom refid="pom"/>
</artifact:dependencies>
<delete file="${basedir}/dependencies.xml"/>
<!-- Pull the dependencies for Modello -->
<artifact:dependencies pathId="modello.pathid" filesetId="modello.fileset" verbose="${verbose}">
<localRepository path="${maven.repo.local}"/>
<dependency groupId="org.codehaus.modello" artifactId="modello-maven-plugin" version="${pom.properties.modelloVersion}"/>
</artifact:dependencies>
<!-- Pull the dependencies for Modello -->
<artifact:dependencies pathId="modello.pathid" filesetId="modello.fileset" verbose="${verbose}">
<localRepository path="${maven.repo.local}"/>
<dependency groupId="org.codehaus.modello" artifactId="modello-maven-plugin" version="${pom.properties.modelloVersion}"/>
</artifact:dependencies>
<!-- Pull the dependencies for the MetadataGenerator CLI -->
<artifact:dependencies pathId="pmdg.pathid" filesetId="pmdg.fileset" verbose="${verbose}">
<localRepository path="${maven.repo.local}"/>
<dependency groupId="org.codehaus.plexus" artifactId="plexus-component-metadata" version="${pom.properties.plexusVersion}"/>
</artifact:dependencies>
<!-- Pull the dependencies for the MetadataGenerator CLI -->
<artifact:dependencies pathId="pmdg.pathid" filesetId="pmdg.fileset" verbose="${verbose}">
<localRepository path="${maven.repo.local}"/>
<dependency groupId="org.codehaus.plexus" artifactId="plexus-component-metadata" version="${pom.properties.plexusVersion}"/>
</artifact:dependencies>
</target>
</target>
<target name="process-classes" depends="pull" description="generates plexus component metadata.">
<mkdir dir="${basedir}/bootstrap/target"/>
<mkdir dir="${basedir}/bootstrap/target/classes"/>
<target name="process-classes" depends="pull" description="generates plexus component metadata.">
<mkdir dir="${basedir}/bootstrap/target"/>
<mkdir dir="${basedir}/bootstrap/target/classes"/>
<path id="maven.classpath">
<pathelement location="bootstrap/target/classes"/>
<path refid="sources"/>
<path refid="pom.pathid"/>
<path refid="pmdg.pathid"/>
</path>
<path id="maven.classpath">
<pathelement location="bootstrap/target/classes"/>
<path refid="sources"/>
<path refid="pom.pathid"/>
<path refid="pmdg.pathid"/>
</path>
<echo>Using plexus version ${pom.properties.plexusVersion}</echo>
<java fork="fork" classname="org.codehaus.plexus.metadata.PlexusMetadataGeneratorCli" failonerror="true">
<classpath refid="maven.classpath"/>
<!-- We need to generate component descriptors from the maven-artifact sources which use javadoc annotations. -->
<arg value="--source"/>
<arg value="${basedir}/maven-compat/src/main/java"/>
<!-- We have separated the artifact handlers and lifecycle mappings into a separate file. -->
<arg value="--descriptors"/>
<arg value="${basedir}/maven-core/src/main/resources/META-INF/plexus"/>
<!-- Search the classes for annotations that we've compiled. -->
<arg value="--classes"/>
<arg value="${basedir}/bootstrap/target/classes"/>
<!-- We'll make one big fat components descriptor. -->
<arg value="--output"/>
<arg value="${basedir}/bootstrap/target/classes/META-INF/plexus/components.xml"/>
</java>
</target>
<echo>Using plexus version ${pom.properties.plexusVersion}</echo>
<java fork="fork" classname="org.codehaus.plexus.metadata.PlexusMetadataGeneratorCli" failonerror="true">
<classpath refid="maven.classpath"/>
<!-- We need to generate component descriptors from the maven-artifact sources which use javadoc annotations. -->
<arg value="--source"/>
<arg value="${basedir}/maven-compat/src/main/java"/>
<!-- We have separated the artifact handlers and lifecycle mappings into a separate file. -->
<arg value="--descriptors"/>
<arg value="${basedir}/maven-core/src/main/resources/META-INF/plexus"/>
<!-- Search the classes for annotations that we've compiled. -->
<arg value="--classes"/>
<arg value="${basedir}/bootstrap/target/classes"/>
<!-- We'll make one big fat components descriptor. -->
<arg value="--output"/>
<arg value="${basedir}/bootstrap/target/classes/META-INF/plexus/components.xml"/>
</java>
</target>
<target name="generate-sources" depends="pull" description="generates Java sources from Modello mdo model files">
<mkdir dir="bootstrap/target"/>
<mkdir dir="bootstrap/target/generated-sources"/>
<target name="generate-sources" depends="pull" description="generates Java sources from Modello mdo model files">
<mkdir dir="bootstrap/target"/>
<mkdir dir="bootstrap/target/generated-sources"/>
<macrodef name="modello-single-mode">
<attribute name="file"/>
<attribute name="mode"/>
<attribute name="version"/>
<sequential>
<java fork="fork" classname="org.codehaus.modello.ModelloCli" failonerror="true">
<classpath refid="modello.pathid"/>
<arg file="@{file}"/> <!-- model file -->
<arg value="@{mode}"/> <!-- output type -->
<arg file="bootstrap/target/generated-sources"/> <!-- output directory -->
<arg value="@{version}"/> <!-- model version -->
<arg value="false"/> <!-- package with version -->
<arg value="true"/> <!-- use Java 5 -->
<arg value="UTF-8"/> <!-- encoding -->
</java>
</sequential>
</macrodef>
<macrodef name="modello-single-mode">
<attribute name="file"/>
<attribute name="mode"/>
<attribute name="version"/>
<sequential>
<java fork="fork" classname="org.codehaus.modello.ModelloCli" failonerror="true">
<classpath refid="modello.pathid"/>
<arg file="@{file}"/> <!-- model file -->
<arg value="@{mode}"/> <!-- output type -->
<arg file="bootstrap/target/generated-sources"/> <!-- output directory -->
<arg value="@{version}"/> <!-- model version -->
<arg value="false"/> <!-- package with version -->
<arg value="true"/> <!-- use Java 5 -->
<arg value="UTF-8"/> <!-- encoding -->
</java>
</sequential>
</macrodef>
<macrodef name="modello">
<attribute name="file"/>
<attribute name="version" default="1.0.0"/>
<sequential>
<echo taskname="modello" message="Generating sources for @{file}"/>
<modello-single-mode file="@{file}" version="@{version}" mode="java"/>
<modello-single-mode file="@{file}" version="@{version}" mode="xpp3-reader"/>
<modello-single-mode file="@{file}" version="@{version}" mode="xpp3-writer"/>
</sequential>
</macrodef>
<macrodef name="modello">
<attribute name="file"/>
<attribute name="version" default="1.0.0"/>
<sequential>
<echo taskname="modello" message="Generating sources for @{file}"/>
<modello-single-mode file="@{file}" version="@{version}" mode="java"/>
<modello-single-mode file="@{file}" version="@{version}" mode="xpp3-reader"/>
<modello-single-mode file="@{file}" version="@{version}" mode="xpp3-writer"/>
</sequential>
</macrodef>
<modello file="maven-model/src/main/mdo/maven.mdo" version="4.0.0"/>
<modello file="maven-plugin-api/src/main/mdo/lifecycle.mdo"/>
<modello file="maven-model-builder/src/main/mdo/profiles.mdo"/>
<modello file="maven-core/src/main/mdo/settings.mdo"/>
<modello file="maven-toolchain/src/main/mdo/toolchains.mdo"/>
<modello file="maven-compat/src/main/mdo/metadata.mdo"/>
</target>
<modello file="maven-model/src/main/mdo/maven.mdo" version="4.0.0"/>
<modello file="maven-plugin-api/src/main/mdo/lifecycle.mdo"/>
<modello file="maven-model-builder/src/main/mdo/profiles.mdo"/>
<modello file="maven-core/src/main/mdo/settings.mdo"/>
<modello file="maven-toolchain/src/main/mdo/toolchains.mdo"/>
<modello file="maven-compat/src/main/mdo/metadata.mdo"/>
</target>
<target name="compile-boot" depends="generate-sources" description="compiles the bootstrap sources">
<path id="sources">
<dirset dir=".">
<include name="bootstrap/target/generated-sources"/>
<include name="*/src/main/*"/>
</dirset>
</path>
<target name="compile-boot" depends="generate-sources" description="compiles the bootstrap sources">
<path id="sources">
<dirset dir=".">
<include name="bootstrap/target/generated-sources"/>
<include name="*/src/main/*"/>
</dirset>
</path>
<mkdir dir="bootstrap/target/classes"/>
<javac destdir="bootstrap/target/classes" encoding="UTF-8" source="1.5" target="1.5" debug="true">
<src refid="sources"/>
<classpath refid="pom.pathid"/>
</javac>
<mkdir dir="bootstrap/target/classes"/>
<javac destdir="bootstrap/target/classes" encoding="UTF-8" source="1.5" target="1.5" debug="true">
<src refid="sources"/>
<classpath refid="pom.pathid"/>
</javac>
<path id="maven.classpath">
<pathelement location="bootstrap/target/classes"/>
<pathelement location="maven-compat/src/main/resources"/>
<path refid="sources"/>
<path refid="pom.pathid"/>
</path>
</target>
<path id="maven.classpath">
<pathelement location="bootstrap/target/classes"/>
<pathelement location="maven-compat/src/main/resources"/>
<path refid="sources"/>
<path refid="pom.pathid"/>
</path>
</target>
<target name="maven-compile" depends="compile-boot,process-classes" description="compiles Maven using the bootstrap Maven, skipping automated tests">
<java fork="true" classname="org.apache.maven.cli.MavenCli" failonerror="true">
<classpath refid="maven.classpath"/>
<arg value="${maven.debug}"/>
<arg value="-B"/>
<arg value="-X"/>
<arg value="-e"/>
<arg value="clean"/>
<arg value="install"/>
<arg value="-Dmaven.test.skip=${maven.test.skip}"/>
<arg value="-Dmaven.repo.local=${maven.repo.local}"/>
<arg value="-Dsurefire.useFile=${surefire.useFile}"/>
</java>
</target>
<target name="maven-compile" depends="compile-boot,process-classes" description="compiles Maven using the bootstrap Maven, skipping automated tests">
<java fork="true" classname="org.apache.maven.cli.MavenCli" failonerror="true">
<classpath refid="maven.classpath"/>
<arg value="${maven.debug}"/>
<arg value="-B"/>
<arg value="-X"/>
<arg value="-e"/>
<arg value="clean"/>
<arg value="install"/>
<arg value="-Dmaven.test.skip=${maven.test.skip}"/>
<arg value="-Dmaven.repo.local=${maven.repo.local}"/>
<arg value="-Dsurefire.useFile=${surefire.useFile}"/>
</java>
</target>
<target name="maven-assembly" depends="maven-compile" description="generates the Maven installation assembly using the bootstrap Maven">
<echo>
The new Maven distribution was created as part of the MAVEN-COMPILE step, above.
This goal just validates the presence of that distribution.
</echo>
<condition property="build.failed">
<not>
<available file="${maven.assembly}"/>
</not>
</condition>
<fail if="build.failed" message="Assembly task seemed to succeed, but couldn't find assembly file: ${maven.assembly}"/>
</target>
<target name="maven-assembly" depends="maven-compile" description="generates the Maven installation assembly using the bootstrap Maven">
<echo>
The new Maven distribution was created as part of the MAVEN-COMPILE step, above.
This goal just validates the presence of that distribution.
</echo>
<condition property="build.failed">
<not>
<available file="${maven.assembly}"/>
</not>
</condition>
<fail if="build.failed" message="Assembly task seemed to succeed, but couldn't find assembly file: ${maven.assembly}"/>
</target>
<target name="extract-assembly" depends="init,maven-assembly" description="extracts the maven assembly into maven.home">
<echo>Extracting assembly to ${maven.home.dirname} ...</echo>
<!-- If we are starting from scratch make sure the directory is created -->
<delete dir="${maven.home.effective}"/>
<mkdir dir="${maven.home.effective}"/>
<unzip src="${maven.assembly}" dest="${maven.home.dirname}"/>
<chmod perm="+x">
<fileset dir="${maven.home.effective}/bin">
<include name="mvn"/>
</fileset>
</chmod>
</target>
<target name="extract-assembly" depends="init,maven-assembly" description="extracts the maven assembly into maven.home">
<echo>Extracting assembly to ${maven.home.dirname} ...</echo>
<!-- If we are starting from scratch make sure the directory is created -->
<delete dir="${maven.home.effective}"/>
<mkdir dir="${maven.home.effective}"/>
<unzip src="${maven.assembly}" dest="${maven.home.dirname}"/>
<chmod perm="+x">
<fileset dir="${maven.home.effective}/bin">
<include name="mvn"/>
</fileset>
</chmod>
</target>
<target name="all" depends="clean-bootstrap,init,extract-assembly"/>
<target name="all" depends="clean-bootstrap,init,extract-assembly"/>
</project>

View File

@ -1,4 +1,4 @@
package org.apache.maven.lifecycle;
package org.apache.maven.lifecycle;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
@ -149,11 +149,11 @@ public void execute( MavenSession session )
{
session.setCurrentProject( currentProject );
List<MojoExecution> lifecyclePlan;
MavenExecutionPlan executionPlan;
try
{
lifecyclePlan = calculateBuildPlan( session, goals.toArray( new String[] {} ) );
executionPlan = calculateExecutionPlan( session, goals.toArray( new String[] {} ) );
}
catch ( Exception e )
{
@ -168,7 +168,7 @@ public void execute( MavenSession session )
// mojoDescriptor.isDependencyResolutionRequired() is actually the scope of the dependency resolution required, not a boolean ... yah.
try
{
downloadProjectDependencies( session, Artifact.SCOPE_TEST /** mojoDescriptor.isDependencyResolutionRequired()*/ );
downloadProjectDependencies( session, executionPlan.getRequiredResolutionScope() );
}
catch ( ArtifactNotFoundException e )
{
@ -185,7 +185,7 @@ public void execute( MavenSession session )
{
logger.debug( "=== BUILD PLAN ===" );
logger.debug( "Project: " + currentProject );
for ( MojoExecution mojoExecution : lifecyclePlan )
for ( MojoExecution mojoExecution : executionPlan.getExecutions() )
{
MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
@ -197,7 +197,7 @@ public void execute( MavenSession session )
logger.debug( "==================" );
}
for ( MojoExecution mojoExecution : lifecyclePlan )
for ( MojoExecution mojoExecution : executionPlan.getExecutions() )
{
try
{
@ -224,7 +224,7 @@ public void execute( MavenSession session )
// 3. Find the mojos associated with the lifecycle given the project packaging (jar lifecycle mapping for the default lifecycle)
// 4. Bind those mojos found in the lifecycle mapping for the packaging to the lifecycle
// 5. Bind mojos specified in the project itself to the lifecycle
public List<MojoExecution> calculateBuildPlan( MavenSession session, String... tasks )
public MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException
{
MavenProject project = session.getCurrentProject();
@ -233,6 +233,8 @@ public List<MojoExecution> calculateBuildPlan( MavenSession session, String...
List<MojoExecution> lifecyclePlan = new ArrayList<MojoExecution>();
String requiredDependencyResolutionScope = null;
for ( String task : tasks )
{
@ -381,7 +383,6 @@ public List<MojoExecution> calculateBuildPlan( MavenSession session, String...
break;
}
}
}
}
@ -397,6 +398,8 @@ public List<MojoExecution> calculateBuildPlan( MavenSession session, String...
MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor(
mojoExecution.getGroupId(), mojoExecution.getArtifactId(), mojoExecution.getVersion(), mojoExecution.getGoal(), session.getLocalRepository(), project.getRemoteArtifactRepositories() );
requiredDependencyResolutionScope = calculateRequiredDependencyResolutionScope( requiredDependencyResolutionScope, mojoDescriptor.isDependencyResolutionRequired() );
mojoExecution.setMojoDescriptor( mojoDescriptor );
populateMojoExecutionConfiguration( project, mojoExecution, false );
@ -404,9 +407,40 @@ public List<MojoExecution> calculateBuildPlan( MavenSession session, String...
lifecyclePlan.add( mojoExecution );
}
return lifecyclePlan;
return new MavenExecutionPlan( lifecyclePlan, requiredDependencyResolutionScope );
}
// SCOPE_COMPILE
// SCOPE_TEST
// SCOPE_RUNTIME
//
String calculateRequiredDependencyResolutionScope( String currentRequiredDependencyResolutionScope, String inputScope )
{
if ( inputScope == null )
{
return currentRequiredDependencyResolutionScope;
}
if ( currentRequiredDependencyResolutionScope == null && inputScope != null )
{
return inputScope;
}
if ( currentRequiredDependencyResolutionScope.equals( Artifact.SCOPE_COMPILE ) && ( inputScope.equals( Artifact.SCOPE_RUNTIME ) || inputScope.equals( Artifact.SCOPE_TEST ) ) )
{
return inputScope;
}
if ( currentRequiredDependencyResolutionScope.equals( Artifact.SCOPE_RUNTIME ) && inputScope.equals( Artifact.SCOPE_TEST ) )
{
return inputScope;
}
// Nothing changed we return what we were
//
return currentRequiredDependencyResolutionScope;
}
private String executionDescription( MojoExecution me, MavenProject project )
{
PluginDescriptor pd = me.getMojoDescriptor().getPluginDescriptor();
@ -415,25 +449,23 @@ private String executionDescription( MojoExecution me, MavenProject project )
return sb.toString();
}
private void populateMojoExecutionConfiguration( MavenProject project, MojoExecution mojoExecution,
boolean directInvocation )
private void populateMojoExecutionConfiguration( MavenProject project, MojoExecution mojoExecution, boolean directInvocation )
{
String g = mojoExecution.getGroupId();
String a = mojoExecution.getArtifactId();
Plugin p = project.getPlugin( g + ":" + a );
Plugin plugin = project.getPlugin( g + ":" + a );
if ( p != null )
if ( plugin != null )
{
for ( PluginExecution e : p.getExecutions() )
for ( PluginExecution e : plugin.getExecutions() )
{
if ( mojoExecution.getExecutionId().equals( e.getId() ) )
{
Xpp3Dom executionConfiguration = (Xpp3Dom) e.getConfiguration();
Xpp3Dom mojoConfiguration =
extractMojoConfiguration( executionConfiguration, mojoExecution.getMojoDescriptor() );
Xpp3Dom mojoConfiguration = extractMojoConfiguration( executionConfiguration, mojoExecution.getMojoDescriptor() );
mojoExecution.setConfiguration( mojoConfiguration );
@ -446,9 +478,9 @@ private void populateMojoExecutionConfiguration( MavenProject project, MojoExecu
{
Xpp3Dom defaultDom = convert( mojoExecution.getMojoDescriptor() );
if ( p != null && p.getConfiguration() != null )
if ( plugin != null && plugin.getConfiguration() != null )
{
Xpp3Dom projectDom = (Xpp3Dom) p.getConfiguration();
Xpp3Dom projectDom = (Xpp3Dom) plugin.getConfiguration();
projectDom = extractMojoConfiguration( projectDom, mojoExecution.getMojoDescriptor() );
mojoExecution.setConfiguration( Xpp3Dom.mergeXpp3Dom( projectDom, defaultDom, Boolean.TRUE ) );
}
@ -986,7 +1018,7 @@ protected Metadata readMetadata( File mappingFile )
IOUtil.close( reader );
}
return result;
}
}
// These are checks that should be available in real time to IDEs

View File

@ -28,7 +28,6 @@
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.CycleDetectedInPluginGraphException;
import org.apache.maven.plugin.InvalidPluginDescriptorException;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoNotFoundException;
import org.apache.maven.plugin.PluginDescriptorParsingException;
import org.apache.maven.plugin.PluginNotFoundException;
@ -50,7 +49,7 @@ public interface LifecycleExecutor
* @throws InvalidPluginDescriptorException
* @throws LifecycleExecutionException
*/
List<MojoExecution> calculateBuildPlan( MavenSession session, String... tasks )
MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException;
// For a given project packaging find all the plugins that are bound to any registered

View File

@ -0,0 +1,36 @@
package org.apache.maven.lifecycle;
import java.util.List;
import org.apache.maven.plugin.MojoExecution;
//TODO: lifecycles being executed
//TODO: what runs in each phase
//TODO: plugins that need downloading
//TODO: project dependencies that need downloading
//TODO: unfortunately the plugins need to be downloaded in order to get the plugin.xml file. need to externalize this from the plugin archive.
//TODO: this will be the class that people get in IDEs to modify
public class MavenExecutionPlan
{
/** Individual executions that must be performed. */
private List<MojoExecution> executions;
/** For project dependency resolution, the scope of resolution required if any. */
private String requiredDependencyResolutionScope;
public MavenExecutionPlan( List<MojoExecution> executions, String requiredDependencyResolutionScope )
{
this.executions = executions;
this.requiredDependencyResolutionScope = requiredDependencyResolutionScope;
}
public List<MojoExecution> getExecutions()
{
return executions;
}
public String getRequiredResolutionScope()
{
return requiredDependencyResolutionScope;
}
}

View File

@ -5,10 +5,10 @@
import java.util.List;
import org.apache.maven.AbstractCoreMavenComponentTestCase;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.exception.ExceptionHandler;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.codehaus.plexus.component.annotations.Requirement;
@ -63,9 +63,9 @@ public void testCalculationOfBuildPlanWithIndividualTaskWherePluginIsSpecifiedIn
MavenSession session = createMavenSession( pom );
assertEquals( "project-with-additional-lifecycle-elements", session.getCurrentProject().getArtifactId() );
assertEquals( "1.0", session.getCurrentProject().getVersion() );
List<MojoExecution> lifecyclePlan = lifecycleExecutor.calculateBuildPlan( session, "resources:resources" );
assertEquals( 1, lifecyclePlan.size() );
MojoExecution mojoExecution = lifecyclePlan.get( 0 );
List<MojoExecution> executionPlan = lifecycleExecutor.calculateExecutionPlan( session, "resources:resources" ).getExecutions();
assertEquals( 1, executionPlan.size() );
MojoExecution mojoExecution = executionPlan.get( 0 );
assertNotNull( mojoExecution );
assertEquals( "org.apache.maven.plugins", mojoExecution.getMojoDescriptor().getPluginDescriptor().getGroupId() );
assertEquals( "maven-resources-plugin", mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifactId() );
@ -81,9 +81,9 @@ public void testCalculationOfBuildPlanWithIndividualTaskOfTheCleanLifecycle()
MavenSession session = createMavenSession( pom );
assertEquals( "project-with-additional-lifecycle-elements", session.getCurrentProject().getArtifactId() );
assertEquals( "1.0", session.getCurrentProject().getVersion() );
List<MojoExecution> lifecyclePlan = lifecycleExecutor.calculateBuildPlan( session, "clean" );
assertEquals( 1, lifecyclePlan.size() );
MojoExecution mojoExecution = lifecyclePlan.get( 0 );
List<MojoExecution> executionPlan = lifecycleExecutor.calculateExecutionPlan( session, "clean" ).getExecutions();
assertEquals( 1, executionPlan.size() );
MojoExecution mojoExecution = executionPlan.get( 0 );
assertNotNull( mojoExecution );
assertEquals( "org.apache.maven.plugins", mojoExecution.getMojoDescriptor().getPluginDescriptor().getGroupId() );
assertEquals( "maven-clean-plugin", mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifactId() );
@ -98,7 +98,7 @@ public void testCalculationOfBuildPlanTasksOfTheCleanLifecycleAndTheInstallLifec
MavenSession session = createMavenSession( pom );
assertEquals( "project-with-additional-lifecycle-elements", session.getCurrentProject().getArtifactId() );
assertEquals( "1.0", session.getCurrentProject().getVersion() );
List<MojoExecution> lifecyclePlan = lifecycleExecutor.calculateBuildPlan( session, "clean", "install" );
List<MojoExecution> executionPlan = lifecycleExecutor.calculateExecutionPlan( session, "clean", "install" ).getExecutions();
//[01] clean:clean
//[02] resources:resources
@ -111,18 +111,18 @@ public void testCalculationOfBuildPlanTasksOfTheCleanLifecycleAndTheInstallLifec
//[09] jar:jar
//[10] install:install
//
assertEquals( 10, lifecyclePlan.size() );
assertEquals( 10, executionPlan.size() );
assertEquals( "clean:clean", lifecyclePlan.get( 0 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:resources", lifecyclePlan.get( 1 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:compile", lifecyclePlan.get( 2 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plexus-component-metadata:generate-metadata", lifecyclePlan.get( 3 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:testResources", lifecyclePlan.get( 4 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:testCompile", lifecyclePlan.get( 5 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plexus-component-metadata:generate-test-metadata", lifecyclePlan.get( 6 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "surefire:test", lifecyclePlan.get( 7 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "jar:jar", lifecyclePlan.get( 8 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "install:install", lifecyclePlan.get( 9 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "clean:clean", executionPlan.get( 0 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:resources", executionPlan.get( 1 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:compile", executionPlan.get( 2 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plexus-component-metadata:generate-metadata", executionPlan.get( 3 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:testResources", executionPlan.get( 4 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:testCompile", executionPlan.get( 5 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plexus-component-metadata:generate-test-metadata", executionPlan.get( 6 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "surefire:test", executionPlan.get( 7 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "jar:jar", executionPlan.get( 8 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "install:install", executionPlan.get( 9 ).getMojoDescriptor().getFullGoalName() );
}
// We need to take in multiple lifecycles
@ -133,7 +133,12 @@ public void testCalculationOfBuildPlanWithMultipleExecutionsOfModello()
MavenSession session = createMavenSession( pom );
assertEquals( "project-with-multiple-executions", session.getCurrentProject().getArtifactId() );
assertEquals( "1.0.1", session.getCurrentProject().getVersion() );
List<MojoExecution> lifecyclePlan = lifecycleExecutor.calculateBuildPlan( session, "clean", "install" );
MavenExecutionPlan plan = lifecycleExecutor.calculateExecutionPlan( session, "clean", "install" );
assertEquals( Artifact.SCOPE_TEST, plan.getRequiredResolutionScope() );
List<MojoExecution> executions = plan.getExecutions();
//[01] clean:clean
//[02] modello:xpp3-writer
@ -153,27 +158,27 @@ public void testCalculationOfBuildPlanWithMultipleExecutionsOfModello()
//[16] install:install
//
assertEquals( 16, lifecyclePlan.size() );
assertEquals( 16, executions.size() );
assertEquals( "clean:clean", lifecyclePlan.get( 0 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:xpp3-writer", lifecyclePlan.get( 1 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:java", lifecyclePlan.get( 2 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:xpp3-reader", lifecyclePlan.get( 3 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:xpp3-writer", lifecyclePlan.get( 4 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:java", lifecyclePlan.get( 5 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:xpp3-reader", lifecyclePlan.get( 6 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plugin:descriptor", lifecyclePlan.get( 7 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:resources", lifecyclePlan.get( 8 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:compile", lifecyclePlan.get( 9 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:testResources", lifecyclePlan.get( 10 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:testCompile", lifecyclePlan.get( 11 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "surefire:test", lifecyclePlan.get( 12 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plugin:addPluginArtifactMetadata", lifecyclePlan.get( 13 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "jar:jar", lifecyclePlan.get( 14 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "install:install", lifecyclePlan.get( 15 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "clean:clean", executions.get( 0 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:xpp3-writer", executions.get( 1 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:java", executions.get( 2 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:xpp3-reader", executions.get( 3 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:xpp3-writer", executions.get( 4 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:java", executions.get( 5 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "modello:xpp3-reader", executions.get( 6 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plugin:descriptor", executions.get( 7 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:resources", executions.get( 8 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:compile", executions.get( 9 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:testResources", executions.get( 10 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:testCompile", executions.get( 11 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "surefire:test", executions.get( 12 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plugin:addPluginArtifactMetadata", executions.get( 13 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "jar:jar", executions.get( 14 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "install:install", executions.get( 15 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "src/main/mdo/remote-resources.mdo", new MojoExecutionXPathContainer( lifecyclePlan.get( 1 ) ).getValue( "configuration/models[1]/model" ) );
assertEquals( "src/main/mdo/supplemental-model.mdo", new MojoExecutionXPathContainer( lifecyclePlan.get( 4 ) ).getValue( "configuration/models[1]/model" ) );
assertEquals( "src/main/mdo/remote-resources.mdo", new MojoExecutionXPathContainer( executions.get( 1 ) ).getValue( "configuration/models[1]/model" ) );
assertEquals( "src/main/mdo/supplemental-model.mdo", new MojoExecutionXPathContainer( executions.get( 4 ) ).getValue( "configuration/models[1]/model" ) );
}
public void testCalculationOfBuildPlanWithIndividualTaskOfTheCleanCleanGoal()
@ -185,9 +190,9 @@ public void testCalculationOfBuildPlanWithIndividualTaskOfTheCleanCleanGoal()
MavenSession session = createMavenSession( pom );
assertEquals( "project-with-additional-lifecycle-elements", session.getCurrentProject().getArtifactId() );
assertEquals( "1.0", session.getCurrentProject().getVersion() );
List<MojoExecution> lifecyclePlan = lifecycleExecutor.calculateBuildPlan( session, "clean:clean" );
assertEquals( 1, lifecyclePlan.size() );
MojoExecution mojoExecution = lifecyclePlan.get( 0 );
List<MojoExecution> executionPlan = lifecycleExecutor.calculateExecutionPlan( session, "clean:clean" ).getExecutions();
assertEquals( 1, executionPlan.size() );
MojoExecution mojoExecution = executionPlan.get( 0 );
assertNotNull( mojoExecution );
assertEquals( "org.apache.maven.plugins", mojoExecution.getMojoDescriptor().getPluginDescriptor().getGroupId() );
assertEquals( "maven-clean-plugin", mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifactId() );
@ -201,7 +206,7 @@ public void testLifecycleQueryingUsingADefaultLifecyclePhase()
MavenSession session = createMavenSession( pom );
assertEquals( "project-with-additional-lifecycle-elements", session.getCurrentProject().getArtifactId() );
assertEquals( "1.0", session.getCurrentProject().getVersion() );
List<MojoExecution> lifecyclePlan = lifecycleExecutor.calculateBuildPlan( session, "package" );
List<MojoExecution> executionPlan = lifecycleExecutor.calculateExecutionPlan( session, "package" ).getExecutions();
//[01] resources:resources
//[02] compiler:compile
@ -212,16 +217,16 @@ public void testLifecycleQueryingUsingADefaultLifecyclePhase()
//[07] surefire:test
//[08] jar:jar
//
assertEquals( 8, lifecyclePlan.size() );
assertEquals( 8, executionPlan.size() );
assertEquals( "resources:resources", lifecyclePlan.get( 0 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:compile", lifecyclePlan.get( 1 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plexus-component-metadata:generate-metadata", lifecyclePlan.get( 2 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:testResources", lifecyclePlan.get( 3 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:testCompile", lifecyclePlan.get( 4 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plexus-component-metadata:generate-test-metadata", lifecyclePlan.get( 5 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "surefire:test", lifecyclePlan.get( 6 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "jar:jar", lifecyclePlan.get( 7 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:resources", executionPlan.get( 0 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:compile", executionPlan.get( 1 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plexus-component-metadata:generate-metadata", executionPlan.get( 2 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "resources:testResources", executionPlan.get( 3 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "compiler:testCompile", executionPlan.get( 4 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "plexus-component-metadata:generate-test-metadata", executionPlan.get( 5 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "surefire:test", executionPlan.get( 6 ).getMojoDescriptor().getFullGoalName() );
assertEquals( "jar:jar", executionPlan.get( 7 ).getMojoDescriptor().getFullGoalName() );
}
public void testLifecyclePluginsRetrievalForDefaultLifecycle()
@ -262,4 +267,18 @@ public void testFindingPluginPrefixforCleanClean()
Plugin plugin = lifecycleExecutor.findPluginForPrefix( "clean", session );
assertNotNull( plugin );
}
//
public void testRequiredDependencyResolutionScopeCalculation()
throws Exception
{
assertEquals( Artifact.SCOPE_COMPILE, lifecycleExecutor.calculateRequiredDependencyResolutionScope( null, Artifact.SCOPE_COMPILE ) );
assertEquals( Artifact.SCOPE_COMPILE, lifecycleExecutor.calculateRequiredDependencyResolutionScope( Artifact.SCOPE_COMPILE, Artifact.SCOPE_COMPILE ) );
assertEquals( Artifact.SCOPE_RUNTIME, lifecycleExecutor.calculateRequiredDependencyResolutionScope( null, Artifact.SCOPE_RUNTIME ) );
assertEquals( Artifact.SCOPE_RUNTIME, lifecycleExecutor.calculateRequiredDependencyResolutionScope( Artifact.SCOPE_RUNTIME, Artifact.SCOPE_RUNTIME ) );
assertEquals( Artifact.SCOPE_TEST, lifecycleExecutor.calculateRequiredDependencyResolutionScope( null, Artifact.SCOPE_TEST ) );
assertEquals( Artifact.SCOPE_TEST, lifecycleExecutor.calculateRequiredDependencyResolutionScope( Artifact.SCOPE_TEST, Artifact.SCOPE_TEST ) );
assertEquals( Artifact.SCOPE_RUNTIME, lifecycleExecutor.calculateRequiredDependencyResolutionScope( Artifact.SCOPE_COMPILE, Artifact.SCOPE_RUNTIME) );
}
}

View File

@ -28,11 +28,10 @@
import org.apache.maven.execution.MavenSession;
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.lifecycle.LifecycleExecutor;
import org.apache.maven.lifecycle.MavenExecutionPlan;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.CycleDetectedInPluginGraphException;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.MojoNotFoundException;
import org.apache.maven.plugin.PluginDescriptorParsingException;
import org.apache.maven.plugin.PluginNotFoundException;
@ -49,10 +48,10 @@ public class EmptyLifecycleExecutor
implements LifecycleExecutor
{
public List<MojoExecution> calculateBuildPlan( MavenSession session, String... tasks )
public MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException
{
return Collections.emptyList();
return new MavenExecutionPlan( Collections.<MojoExecution>emptyList(), null );
}
public void execute( MavenSession session )