001 package org.apache.maven.lifecycle;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import org.apache.maven.execution.MavenSession;
023 import org.apache.maven.lifecycle.internal.LifecycleExecutionPlanCalculator;
024 import org.apache.maven.lifecycle.internal.LifecycleStarter;
025 import org.apache.maven.lifecycle.internal.LifecycleTaskSegmentCalculator;
026 import org.apache.maven.lifecycle.internal.MojoDescriptorCreator;
027 import org.apache.maven.lifecycle.internal.MojoExecutor;
028 import org.apache.maven.lifecycle.internal.ProjectIndex;
029 import org.apache.maven.lifecycle.internal.TaskSegment;
030 import org.apache.maven.model.Plugin;
031 import org.apache.maven.plugin.InvalidPluginDescriptorException;
032 import org.apache.maven.plugin.MojoExecution;
033 import org.apache.maven.plugin.MojoNotFoundException;
034 import org.apache.maven.plugin.PluginDescriptorParsingException;
035 import org.apache.maven.plugin.PluginManagerException;
036 import org.apache.maven.plugin.PluginNotFoundException;
037 import org.apache.maven.plugin.PluginResolutionException;
038 import org.apache.maven.plugin.descriptor.MojoDescriptor;
039 import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
040 import org.apache.maven.plugin.version.PluginVersionResolutionException;
041 import org.apache.maven.project.MavenProject;
042 import org.codehaus.plexus.component.annotations.Component;
043 import org.codehaus.plexus.component.annotations.Requirement;
044
045 import java.util.Arrays;
046 import java.util.List;
047 import java.util.Map;
048 import java.util.Set;
049
050 /**
051 * A facade that provides lifecycle services to components outside maven core.
052 *
053 * Note that this component is not normally used from within core itself.
054 *
055 * @author Jason van Zyl
056 * @author Benjamin Bentmann
057 * @author Kristian Rosenvold
058 */
059 @Component( role = LifecycleExecutor.class )
060 public class DefaultLifecycleExecutor
061 implements LifecycleExecutor
062 {
063
064 @Requirement
065 private LifeCyclePluginAnalyzer lifeCyclePluginAnalyzer;
066
067 @Requirement
068 private DefaultLifecycles defaultLifeCycles;
069
070 @Requirement
071 private LifecycleTaskSegmentCalculator lifecycleTaskSegmentCalculator;
072
073 @Requirement
074 private LifecycleExecutionPlanCalculator lifecycleExecutionPlanCalculator;
075
076 @Requirement
077 private MojoExecutor mojoExecutor;
078
079 @Requirement
080 private LifecycleStarter lifecycleStarter;
081
082
083 public void execute( MavenSession session )
084 {
085 lifecycleStarter.execute( session );
086 }
087
088 @Requirement
089 private MojoDescriptorCreator mojoDescriptorCreator;
090
091 // These methods deal with construction intact Plugin object that look like they come from a standard
092 // <plugin/> block in a Maven POM. We have to do some wiggling to pull the sources of information
093 // together and this really shows the problem of constructing a sensible default configuration but
094 // it's all encapsulated here so it appears normalized to the POM builder.
095
096 // We are going to take the project packaging and find all plugin in the default lifecycle and create
097 // fully populated Plugin objects, including executions with goals and default configuration taken
098 // from the plugin.xml inside a plugin.
099 //
100 // TODO: This whole method could probably removed by injecting lifeCyclePluginAnalyzer straight into client site.
101 // TODO: But for some reason the whole plexus appcontext refuses to start when I try this.
102
103 public Set<Plugin> getPluginsBoundByDefaultToAllLifecycles( String packaging )
104 {
105 return lifeCyclePluginAnalyzer.getPluginsBoundByDefaultToAllLifecycles( packaging );
106 }
107
108 // USED BY MAVEN HELP PLUGIN
109
110 @Deprecated
111 public Map<String, Lifecycle> getPhaseToLifecycleMap()
112 {
113 return defaultLifeCycles.getPhaseToLifecycleMap();
114 }
115
116 // NOTE: Backward-compat with maven-help-plugin:2.1
117
118 @SuppressWarnings( { "UnusedDeclaration" } )
119 MojoDescriptor getMojoDescriptor( String task, MavenSession session, MavenProject project, String invokedVia,
120 boolean canUsePrefix, boolean isOptionalMojo )
121 throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
122 MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
123 PluginVersionResolutionException
124 {
125 return mojoDescriptorCreator.getMojoDescriptor( task, session, project );
126 }
127
128 // Used by m2eclipse
129
130 @SuppressWarnings( { "UnusedDeclaration" } )
131 public MavenExecutionPlan calculateExecutionPlan( MavenSession session, boolean setup, String... tasks )
132 throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
133 MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
134 PluginManagerException, LifecyclePhaseNotFoundException, LifecycleNotFoundException,
135 PluginVersionResolutionException
136 {
137 List<TaskSegment> taskSegments =
138 lifecycleTaskSegmentCalculator.calculateTaskSegments( session, Arrays.asList( tasks ) );
139
140 TaskSegment mergedSegment = new TaskSegment( false );
141
142 for ( TaskSegment taskSegment : taskSegments )
143 {
144 mergedSegment.getTasks().addAll( taskSegment.getTasks() );
145 }
146
147 return lifecycleExecutionPlanCalculator.calculateExecutionPlan( session, session.getCurrentProject(),
148 mergedSegment.getTasks(), setup );
149 }
150
151 public MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
152 throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
153 MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
154 PluginManagerException, LifecyclePhaseNotFoundException, LifecycleNotFoundException,
155 PluginVersionResolutionException
156 {
157 return calculateExecutionPlan( session, true, tasks );
158 }
159
160 // Site 3.x
161 public void calculateForkedExecutions( MojoExecution mojoExecution, MavenSession session )
162 throws MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
163 PluginDescriptorParsingException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
164 LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
165 {
166 lifecycleExecutionPlanCalculator.calculateForkedExecutions( mojoExecution, session );
167 }
168
169 // Site 3.x
170 public List<MavenProject> executeForkedExecutions( MojoExecution mojoExecution, MavenSession session )
171 throws LifecycleExecutionException
172 {
173 return mojoExecutor.executeForkedExecutions( mojoExecution, session, new ProjectIndex( session.getProjects() ) );
174 }
175
176 }