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.Set;
22  
23  import org.apache.maven.api.annotations.Experimental;
24  import org.apache.maven.api.annotations.Immutable;
25  import org.apache.maven.api.annotations.Nonnull;
26  import org.apache.maven.api.annotations.Nullable;
27  import org.apache.maven.api.model.Dependency;
28  
29  /**
30   * A dependency's {@code Type} is uniquely identified by a {@code String},
31   * and semantically represents a known <i>kind</i> of dependency.
32   * <p>
33   * It provides information about the file type (or extension) of the associated artifact,
34   * its default classifier, and how the artifact will be used in the build when creating
35   * class paths or module paths.
36   * <p>
37   * For example, the type {@code java-source} has a {@code jar} extension and a
38   * {@code sources} classifier. The artifact and its dependencies should be added
39   * to the build path.
40   *
41   * @since 4.0.0
42   */
43  @Experimental
44  @Immutable
45  public interface Type extends ExtensibleEnum {
46      /**
47       * Artifact type name for a POM file.
48       */
49      String POM = "pom";
50  
51      /**
52       * Artifact type name for a BOM file.
53       */
54      String BOM = "bom";
55  
56      /**
57       * Artifact type name for a JAR file that can be placed either on the class path or on the module path.
58       * The path (classes or modules) is chosen by the plugin, possibly using heuristic rules.
59       * This is the behavior of Maven 3.
60       */
61      String JAR = "jar";
62  
63      /**
64       * Artifact type name for a fat-JAR file that can be only on the class path.
65       * The fat-JAR is a self-contained JAR and its transitive dependencies will not be resolved, if any.
66       * This type is new in Maven 4.
67       */
68      String FATJAR = "fatjar";
69  
70      /**
71       * Artifact type name for a JAR file to unconditionally place on the class path.
72       * If the JAR is modular, its module information are ignored.
73       * This type is new in Maven 4.
74       */
75      String CLASSPATH_JAR = "classpath-jar";
76  
77      /**
78       * Artifact type name for a JAR file to unconditionally place on the module path.
79       * If the JAR is not modular, then it is loaded by Java as an unnamed module.
80       * This type is new in Maven 4.
81       */
82      String MODULAR_JAR = "modular-jar";
83  
84      /**
85       * Artifact type name for a JAR file that can be placed either on the annotation processor class path
86       * or module path. The path (classes or modules) is chosen by the plugin, possibly using heuristic rules.
87       */
88      String PROCESSOR = "processor";
89  
90      /**
91       * Artifact type name for a JAR file to unconditionally place on the annotation processor class path.
92       * If the JAR is modular, its module information are ignored.
93       */
94      String CLASSPATH_PROCESSOR = "classpath-processor";
95  
96      /**
97       * Artifact type name for a JAR file to unconditionally place on the annotation processor module path.
98       * If the JAR is not modular, then it is loaded by Java as an unnamed module.
99       */
100     String MODULAR_PROCESSOR = "modular-processor";
101 
102     /**
103      * Artifact type name for source code packaged in a JAR file.
104      */
105     String JAVA_SOURCE = "java-source";
106 
107     /**
108      * Artifact type name for javadoc packaged in a JAR file.
109      */
110     String JAVADOC = "javadoc";
111 
112     /**
113      * Artifact type name for a Maven plugin.
114      */
115     String MAVEN_PLUGIN = "maven-plugin";
116 
117     /**
118      * Artifact type name for a JAR file containing test classes. If the main artifact is placed on the class path
119      * ({@value #JAR} or {@value #CLASSPATH_JAR} types), then the test artifact will also be placed on the class path.
120      * Otherwise, if the main artifact is placed on the module path ({@value #JAR} or {@value #MODULAR_JAR} types),
121      * then the test artifact will be added using {@code --patch-module} option.
122      */
123     String TEST_JAR = "test-jar";
124 
125     /**
126      * Artifact type name for a JAR file containing test sources.
127      */
128     String TEST_JAVA_SOURCE = "test-java-source";
129 
130     /**
131      * Returns the dependency type id.
132      * The id uniquely identifies this <i>dependency type</i>.
133      *
134      * @return the id of this type, never {@code null}.
135      */
136     @Nonnull
137     @Override
138     String id();
139 
140     /**
141      * Returns the dependency type language.
142      *
143      * @return the language of this type, never {@code null}.
144      */
145     @Nonnull
146     Language getLanguage();
147 
148     /**
149      * Get the file extension of artifacts of this type.
150      *
151      * @return the file extension, never {@code null}.
152      */
153     @Nonnull
154     String getExtension();
155 
156     /**
157      * Get the default classifier associated to the dependency type.
158      * The default classifier can be overridden when specifying
159      * the {@link Dependency#getClassifier()}.
160      *
161      * @return the default classifier, or {@code null}.
162      */
163     @Nullable
164     String getClassifier();
165 
166     /**
167      * Specifies if the artifact already embeds its own dependencies.
168      * This is the case for JEE packages or similar artifacts such as
169      * WARs, EARs, etc.
170      *
171      * @return if the artifact's dependencies are included in the artifact
172      */
173     boolean isIncludesDependencies();
174 
175     /**
176      * Types of path (class-path, module-path, …) where the dependency can be placed.
177      * For most deterministic builds, the array length should be 1. In such case,
178      * the dependency will be unconditionally placed on the specified type of path
179      * and no heuristic rule will be involved.
180      *
181      * <p>It is nevertheless common to specify two or more types of path. For example,
182      * a Java library may be compatible with either the class path or the module path,
183      * and the user may have provided no instruction about which type to use. In such
184      * case, the plugin may apply rules for choosing a path. See for example
185      * {@link JavaPathType#CLASSES} and {@link JavaPathType#MODULES}.</p>
186      */
187     @Nonnull
188     Set<PathType> getPathTypes();
189 }