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.nio.file.Path;
22  import java.util.List;
23  import java.util.Optional;
24  
25  import org.apache.maven.api.annotations.Experimental;
26  import org.apache.maven.api.annotations.Nonnull;
27  import org.apache.maven.api.model.Build;
28  import org.apache.maven.api.model.Model;
29  
30  /**
31   * Interface representing a Maven project which can be created using the
32   * {@link org.apache.maven.api.services.ProjectBuilder} service.
33   * Such objects are immutable and plugin that wish to modify such objects
34   * need to do so using the {@link org.apache.maven.api.services.ProjectManager}
35   * service.
36   * <p>
37   * Projects are created using the {@code ProjectBuilder} from a POM file
38   * (usually named {@code pom.xml}) on the file system.
39   * The {@link #getPomPath()} will point to the POM file and the
40   * {@link #getBasedir()} to the directory parent containing the
41   * POM file.
42   * </p>
43   *
44   * @since 4.0.0
45   * @see org.apache.maven.api.services.ProjectManager
46   * @see org.apache.maven.api.services.ProjectBuilder
47   */
48  @Experimental
49  public interface Project {
50  
51      /**
52       * Returns the project groupId.
53       */
54      @Nonnull
55      String getGroupId();
56  
57      /**
58       * Returns the project artifactId.
59       */
60      @Nonnull
61      String getArtifactId();
62  
63      /**
64       * Returns the project version.
65       */
66      @Nonnull
67      String getVersion();
68  
69      /**
70       * Returns the project packaging.
71       * <p>
72       * Note: unlike in legacy code, logical checks against string representing packaging (returned by this method)
73       * are NOT recommended (code like {@code "pom".equals(project.getPackaging)} must be avoided). Use method
74       * {@link #getArtifacts()} to gain access to POM or build artifact.
75       *
76       * @see #getArtifacts()
77       */
78      @Nonnull
79      Packaging getPackaging();
80  
81      /**
82       * Returns the project language. It is by default determined by {@link #getPackaging()}.
83       *
84       * @see #getPackaging()
85       */
86      @Nonnull
87      default Language getLanguage() {
88          return getPackaging().language();
89      }
90  
91      /**
92       * Returns the project POM artifact, which is the artifact of the POM of this project. Every project have a POM
93       * artifact, even if the existence of backing POM file is NOT a requirement (i.e. for some transient projects).
94       *
95       * @see org.apache.maven.api.services.ArtifactManager#getPath(Artifact)
96       */
97      @Nonnull
98      default Artifact getPomArtifact() {
99          return getArtifacts().get(0);
100     }
101 
102     /**
103      * Returns the project main artifact, which is the artifact produced by this project build, if applicable.
104      * This artifact MAY be absent if the project is actually not producing any main artifact (i.e. "pom" packaging).
105      *
106      * @see #getPackaging()
107      * @see org.apache.maven.api.services.ArtifactManager#getPath(Artifact)
108      */
109     @Nonnull
110     default Optional<Artifact> getMainArtifact() {
111         List<Artifact> artifacts = getArtifacts();
112         return artifacts.size() == 2 ? Optional.of(artifacts.get(1)) : Optional.empty();
113     }
114 
115     /**
116      * Returns the project artifacts as immutable list. Elements are the project POM artifact and the artifact
117      * produced by this project build, if applicable. Hence, the returned list may have one or two elements
118      * (never less than 1, never more than 2), depending on project packaging.
119      * <p>
120      * The list's first element is ALWAYS the project POM artifact. Presence of second element in the list depends
121      * solely on the project packaging.
122      *
123      * @see #getPackaging()
124      * @see #getPomArtifact()
125      * @see #getMainArtifact()
126      * @see org.apache.maven.api.services.ArtifactManager#getPath(Artifact)
127      */
128     @Nonnull
129     List<Artifact> getArtifacts();
130 
131     /**
132      * Returns the project model.
133      */
134     @Nonnull
135     Model getModel();
136 
137     /**
138      * Shorthand method.
139      */
140     @Nonnull
141     default Build getBuild() {
142         Build build = getModel().getBuild();
143         return build != null ? build : Build.newInstance();
144     }
145 
146     /**
147      * Returns the path to the pom file for this project.
148      * A project is usually read from a file named {@code pom.xml},
149      * which contains the {@linkplain #getModel() model} in an XML form.
150      * When a custom {@code org.apache.maven.api.spi.ModelParser} is used,
151      * the path may point to a non XML file.
152      * <p>
153      * The POM path is also used to define the {@linkplain #getBasedir() base directory}
154      * of the project.
155      *
156      * @return the path of the pom
157      * @see #getBasedir()
158      */
159     @Nonnull
160     Path getPomPath();
161 
162     /**
163      * Returns the project base directory, i.e. the directory containing the project.
164      * A project is usually read from the file system and this will point to
165      * the directory containing the POM file.
166      *
167      * @return the path of the directory containing the project
168      */
169     @Nonnull
170     Path getBasedir();
171 
172     /**
173      * Returns the project direct dependencies (directly specified or inherited).
174      */
175     @Nonnull
176     List<DependencyCoordinate> getDependencies();
177 
178     /**
179      * Returns the project managed dependencies (directly specified or inherited).
180      */
181     @Nonnull
182     List<DependencyCoordinate> getManagedDependencies();
183 
184     /**
185      * Returns the project ID, usable as key.
186      */
187     @Nonnull
188     default String getId() {
189         return getModel().getId();
190     }
191 
192     /**
193      * Returns a boolean indicating if the project is the top level project for
194      * this reactor build.  The top level project may be different from the
195      * {@code rootDirectory}, especially if a subtree of the project is being
196      * built, either because Maven has been launched in a subdirectory or using
197      * a {@code -f} option.
198      *
199      * @return {@code true} if the project is the top level project for this build
200      */
201     boolean isTopProject();
202 
203     /**
204      * Returns a boolean indicating if the project is a root project,
205      * meaning that the {@link #getRootDirectory()} and {@link #getBasedir()}
206      * points to the same directory, and that either {@link Model#isRoot()}
207      * is {@code true} or that {@code basedir} contains a {@code .mvn} child
208      * directory.
209      *
210      * @return {@code true} if the project is the root project
211      * @see Model#isRoot()
212      */
213     boolean isRootProject();
214 
215     /**
216      * Gets the root directory of the project, which is the parent directory
217      * containing the {@code .mvn} directory or flagged with {@code root="true"}.
218      *
219      * @throws IllegalStateException if the root directory could not be found
220      * @see Session#getRootDirectory()
221      */
222     @Nonnull
223     Path getRootDirectory();
224 
225     /**
226      * Returns project parent project, if any.
227      */
228     @Nonnull
229     Optional<Project> getParent();
230 }