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 }