View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.api;
20  
21  import java.util.Collection;
22  import java.util.List;
23  import java.util.stream.Stream;
24  
25  import org.apache.maven.api.annotations.Experimental;
26  import org.apache.maven.api.annotations.Immutable;
27  import org.apache.maven.api.annotations.Nonnull;
28  import org.apache.maven.api.model.Plugin;
29  
30  /**
31   * A Maven lifecycle is a sequence of predefined phases that govern the build process
32   * of a Maven project. Each phase represents a specific step, such as compiling the
33   * code, running tests, packaging the project, and deploying it. Executing a phase
34   * triggers all preceding phases, ensuring that each step of the build process is
35   * completed in the correct order. The three main lifecycles in Maven are
36   * {@link #DEFAULT default}, {@link #CLEAN clean}, and {@link #SITE site}, with the
37   * {@code default} lifecycle being the most commonly used for project builds.
38   *
39   * @since 4.0.0
40   */
41  @Experimental
42  @Immutable
43  public interface Lifecycle extends ExtensibleEnum {
44  
45      // =========================
46      // Maven defined lifecycles
47      // =========================
48      String CLEAN = "clean";
49      String DEFAULT = "default";
50      String SITE = "site";
51  
52      // ======================
53      // Phase qualifiers
54      // ======================
55      String BEFORE = "before:";
56      String AFTER = "after:";
57      String AT = "at:";
58  
59      /**
60       * Name or identifier of this lifecycle.
61       *
62       * @return the unique identifier for this lifecycle
63       */
64      @Override
65      String id();
66  
67      /**
68       * Collection of main phases for this lifecycle.
69       *
70       * @return the collection of top-level phases in this lifecycle
71       */
72      Collection<Phase> phases();
73  
74      /**
75       * Collection of main phases for this lifecycle used with the Maven 3 builders.
76       * Those builders do not operate on a graph, but on the list and expect a slightly
77       * different ordering (mainly unit test being executed before packaging).
78       *
79       * @return the collection of phases in Maven 3 compatible ordering
80       */
81      default Collection<Phase> v3phases() {
82          return phases();
83      }
84  
85      /**
86       * Stream of phases containing all child phases recursively.
87       *
88       * @return a stream of all phases in this lifecycle, including nested phases
89       */
90      default Stream<Phase> allPhases() {
91          return phases().stream().flatMap(Phase::allPhases);
92      }
93  
94      /**
95       * Collection of aliases for this lifecycle.
96       * Aliases map Maven 3 phase names to their Maven 4 equivalents.
97       *
98       * @return the collection of phase aliases
99       */
100     Collection<Alias> aliases();
101 
102     /**
103      * A phase in the lifecycle.
104      *
105      * A phase is identified by its name. It also contains a list of plugins bound to that phase,
106      * a list of {@link Link links}, and a list of sub-phases.  This forms a tree of phases.
107      */
108     interface Phase {
109 
110         // ======================
111         // Maven defined phases
112         // ======================
113         String ALL = "all";
114         String EACH = "each";
115         String BUILD = "build";
116         String INITIALIZE = "initialize";
117         String VALIDATE = "validate";
118         String SOURCES = "sources";
119         String RESOURCES = "resources";
120         String COMPILE = "compile";
121         String READY = "ready";
122         String PACKAGE = "package";
123         String VERIFY = "verify";
124         String UNIT_TEST = "unit-test";
125         String TEST_SOURCES = "test-sources";
126         String TEST_RESOURCES = "test-resources";
127         String TEST_COMPILE = "test-compile";
128         String TEST = "test";
129         String INTEGRATION_TEST = "integration-test";
130         String INSTALL = "install";
131         String DEPLOY = "deploy";
132         String CLEAN = "clean";
133 
134         /**
135          * Returns the name of this phase.
136          *
137          * @return the phase name
138          */
139         @Nonnull
140         String name();
141 
142         /**
143          * Returns the list of plugins bound to this phase.
144          *
145          * @return the list of plugins
146          */
147         @Nonnull
148         List<Plugin> plugins();
149 
150         /**
151          * Returns the collection of links from this phase to other phases.
152          *
153          * @return the collection of links
154          */
155         @Nonnull
156         Collection<Link> links();
157 
158         /**
159          * {@return the list of sub-phases}
160          */
161         @Nonnull
162         List<Phase> phases();
163 
164         /**
165          * Returns a stream of all phases, including this phase and all nested phases.
166          *
167          * @return a stream of all phases
168          */
169         @Nonnull
170         Stream<Phase> allPhases();
171     }
172 
173     /**
174      * A phase alias, mostly used to support the Maven 3 phases which are mapped
175      * to dynamic phases in Maven 4.
176      */
177     interface Alias {
178         /**
179          * Returns the Maven 3 phase name.
180          *
181          * @return the Maven 3 phase name
182          */
183         String v3Phase();
184 
185         /**
186          * Returns the Maven 4 phase name.
187          *
188          * @return the Maven 4 phase name
189          */
190         String v4Phase();
191     }
192 
193     /**
194      * A link from a phase to another phase, consisting of a type which can be
195      * {@link Kind#BEFORE} or {@link Kind#AFTER}, and a {@link Pointer} to
196      * another phase.
197      */
198     interface Link {
199         enum Kind {
200             BEFORE,
201             AFTER
202         }
203 
204         /**
205          * Returns the kind of link (BEFORE or AFTER).
206          *
207          * @return the link kind
208          */
209         Kind kind();
210 
211         /**
212          * Returns the pointer to the target phase.
213          *
214          * @return the phase pointer
215          */
216         Pointer pointer();
217     }
218 
219     interface Pointer {
220         enum Type {
221             PROJECT,
222             DEPENDENCIES,
223             CHILDREN
224         }
225 
226         /**
227          * Returns the name of the target phase.
228          *
229          * @return the phase name
230          */
231         String phase();
232 
233         /**
234          * Returns the type of pointer (PROJECT, DEPENDENCIES, or CHILDREN).
235          *
236          * @return the pointer type
237          */
238         Type type();
239     }
240 
241     interface PhasePointer extends Pointer {
242         /**
243          * Returns the type of pointer, which is always PROJECT for a PhasePointer.
244          *
245          * @return the PROJECT pointer type
246          */
247         @Override
248         default Type type() {
249             return Type.PROJECT;
250         }
251     }
252 
253     interface DependenciesPointer extends Pointer {
254         /**
255          * Returns the dependency scope this pointer applies to.
256          *
257          * @return the dependency scope, or "all" if not specified
258          */
259         String scope(); // default: all
260 
261         /**
262          * Returns the type of pointer, which is always DEPENDENCIES for a DependenciesPointer.
263          *
264          * @return the DEPENDENCIES pointer type
265          */
266         @Override
267         default Type type() {
268             return Type.DEPENDENCIES;
269         }
270     }
271 
272     interface ChildrenPointer extends Pointer {
273         /**
274          * Returns the type of pointer, which is always CHILDREN for a ChildrenPointer.
275          *
276          * @return the CHILDREN pointer type
277          */
278         @Override
279         default Type type() {
280             return Type.CHILDREN;
281         }
282     }
283 }