1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.lifecycle.internal;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Singleton;
24
25 import java.util.HashSet;
26 import java.util.List;
27
28 import org.apache.maven.artifact.Artifact;
29 import org.apache.maven.execution.BuildSuccess;
30 import org.apache.maven.execution.ExecutionEvent;
31 import org.apache.maven.execution.MavenSession;
32 import org.apache.maven.execution.ProjectExecutionEvent;
33 import org.apache.maven.execution.ProjectExecutionListener;
34 import org.apache.maven.lifecycle.MavenExecutionPlan;
35 import org.apache.maven.lifecycle.internal.builder.BuilderCommon;
36 import org.apache.maven.plugin.MojoExecution;
37 import org.apache.maven.project.MavenProject;
38
39
40
41
42
43
44
45
46
47
48
49
50 @Singleton
51 @Named
52 public class LifecycleModuleBuilder {
53
54 @Inject
55 private MojoExecutor mojoExecutor;
56
57 @Inject
58 private BuilderCommon builderCommon;
59
60 @Inject
61 private ExecutionEventCatapult eventCatapult;
62
63 private ProjectExecutionListener projectExecutionListener;
64
65
66
67 @Inject
68 public void setProjectExecutionListeners(final List<ProjectExecutionListener> listeners) {
69 this.projectExecutionListener = new CompoundProjectExecutionListener(listeners);
70 }
71
72 public void buildProject(
73 MavenSession session, ReactorContext reactorContext, MavenProject currentProject, TaskSegment taskSegment) {
74 buildProject(session, session, reactorContext, currentProject, taskSegment);
75 }
76
77 public void buildProject(
78 MavenSession session,
79 MavenSession rootSession,
80 ReactorContext reactorContext,
81 MavenProject currentProject,
82 TaskSegment taskSegment) {
83 session.setCurrentProject(currentProject);
84
85 long buildStartTime = System.currentTimeMillis();
86
87 try {
88
89 if (reactorContext.getReactorBuildStatus().isHaltedOrBlacklisted(currentProject)) {
90 eventCatapult.fire(ExecutionEvent.Type.ProjectSkipped, session, null);
91 return;
92 }
93
94 BuilderCommon.attachToThread(currentProject);
95
96 projectExecutionListener.beforeProjectExecution(new ProjectExecutionEvent(session, currentProject));
97
98 eventCatapult.fire(ExecutionEvent.Type.ProjectStarted, session, null);
99
100 MavenExecutionPlan executionPlan =
101 builderCommon.resolveBuildPlan(session, currentProject, taskSegment, new HashSet<Artifact>());
102 List<MojoExecution> mojoExecutions = executionPlan.getMojoExecutions();
103
104 projectExecutionListener.beforeProjectLifecycleExecution(
105 new ProjectExecutionEvent(session, currentProject, mojoExecutions));
106 mojoExecutor.execute(session, mojoExecutions, reactorContext.getProjectIndex());
107
108 long buildEndTime = System.currentTimeMillis();
109
110 projectExecutionListener.afterProjectExecutionSuccess(
111 new ProjectExecutionEvent(session, currentProject, mojoExecutions));
112
113 reactorContext.getResult().addBuildSummary(new BuildSuccess(currentProject, buildEndTime - buildStartTime));
114
115 eventCatapult.fire(ExecutionEvent.Type.ProjectSucceeded, session, null);
116 } catch (Throwable t) {
117 builderCommon.handleBuildError(reactorContext, rootSession, session, currentProject, t, buildStartTime);
118
119 projectExecutionListener.afterProjectExecutionFailure(
120 new ProjectExecutionEvent(session, currentProject, t));
121
122
123 if (t instanceof RuntimeException) {
124 throw (RuntimeException) t;
125 }
126 if (t instanceof Error) {
127 throw (Error) t;
128 }
129 } finally {
130 session.setCurrentProject(null);
131
132 Thread.currentThread().setContextClassLoader(reactorContext.getOriginalContextClassLoader());
133 }
134 }
135 }