1 package org.apache.maven.archiver;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 /**
23 * Capture common manifest configuration.
24 *
25 * @author <a href="mailto:brett@apache.org">Brett Porter</a>
26 */
27 // TODO Is this general enough to be in Plexus Archiver?
28 public class ManifestConfiguration
29 {
30 /**
31 * The simple layout.
32 */
33 public static final String CLASSPATH_LAYOUT_TYPE_SIMPLE = "simple";
34
35 /**
36 * The layout type
37 */
38 public static final String CLASSPATH_LAYOUT_TYPE_REPOSITORY = "repository";
39
40 /**
41 * custom layout type.
42 */
43 public static final String CLASSPATH_LAYOUT_TYPE_CUSTOM = "custom";
44
45 private String mainClass;
46
47 private String packageName;
48
49 private boolean addClasspath;
50
51 private boolean addExtensions;
52
53 /**
54 * This gets prefixed to all classpath entries.
55 */
56 private String classpathPrefix = "";
57
58 /**
59 * Add default, reproducible entries {@code Created-By} and {@code Build-Jdk-Spec}.
60 *
61 * @since 3.4.0
62 */
63 private boolean addDefaultEntries = true;
64
65
66 /**
67 * Add build environment information about Maven, JDK, and OS.
68 *
69 * @since 3.4.0
70 */
71 private boolean addBuildEnvironmentEntries;
72
73 /**
74 * Add default implementation entries if this is an extension specification.
75 *
76 * @since 2.1
77 */
78 private boolean addDefaultSpecificationEntries;
79
80 /**
81 * Add default implementation entries if this is an extension.
82 *
83 * @since 2.1
84 */
85 private boolean addDefaultImplementationEntries;
86
87 private String classpathLayoutType = CLASSPATH_LAYOUT_TYPE_SIMPLE;
88
89 private String customClasspathLayout;
90
91 private boolean useUniqueVersions = true;
92
93 /**
94 * @return mainClass
95 */
96 public String getMainClass()
97 {
98 return mainClass;
99 }
100
101 /**
102 * @return the package name.
103 */
104 public String getPackageName()
105 {
106 return packageName;
107 }
108
109 /**
110 * @return if addClasspath true or false.
111 */
112 public boolean isAddClasspath()
113 {
114 return addClasspath;
115 }
116
117 /**
118 * @return {@link #addDefaultEntries}
119 */
120 public boolean isAddDefaultEntries()
121 {
122 return addDefaultEntries;
123 }
124
125 /**
126 * @return {@link #addBuildEnvironmentEntries}
127 */
128 public boolean isAddBuildEnvironmentEntries()
129 {
130 return addBuildEnvironmentEntries;
131 }
132
133 /**
134 * @return {@link #addDefaultImplementationEntries}
135 */
136 public boolean isAddDefaultImplementationEntries()
137 {
138 return addDefaultImplementationEntries;
139 }
140
141 /**
142 * @return {@link #addDefaultSpecificationEntries}
143 */
144 public boolean isAddDefaultSpecificationEntries()
145 {
146 return addDefaultSpecificationEntries;
147 }
148
149 /**
150 * @return {@link #addExtensions}
151 */
152 public boolean isAddExtensions()
153 {
154 return addExtensions;
155 }
156
157 /**
158 * @param addClasspath turn on addClasspath or off.
159 */
160 public void setAddClasspath( boolean addClasspath )
161 {
162 this.addClasspath = addClasspath;
163 }
164
165 /**
166 * @param addDefaultEntries add default entries true/false.
167 */
168 public void setAddDefaultEntries( boolean addDefaultEntries )
169 {
170 this.addDefaultEntries = addDefaultEntries;
171 }
172
173 /**
174 * @param addBuildEnvironmentEntries add build environment information true/false.
175 */
176 public void setAddBuildEnvironmentEntries( boolean addBuildEnvironmentEntries )
177 {
178 this.addBuildEnvironmentEntries = addBuildEnvironmentEntries;
179 }
180
181 /**
182 * @param addDefaultImplementationEntries true to add default implementations false otherwise.
183 */
184 public void setAddDefaultImplementationEntries( boolean addDefaultImplementationEntries )
185 {
186 this.addDefaultImplementationEntries = addDefaultImplementationEntries;
187 }
188
189 /**
190 * @param addDefaultSpecificationEntries add default specifications true/false.
191 */
192 public void setAddDefaultSpecificationEntries( boolean addDefaultSpecificationEntries )
193 {
194 this.addDefaultSpecificationEntries = addDefaultSpecificationEntries;
195 }
196
197 /**
198 * @param addExtensions true to add extensions false otherwise.
199 */
200 public void setAddExtensions( boolean addExtensions )
201 {
202 this.addExtensions = addExtensions;
203 }
204
205 /**
206 * @param classpathPrefix The prefix.
207 */
208 public void setClasspathPrefix( String classpathPrefix )
209 {
210 this.classpathPrefix = classpathPrefix;
211 }
212
213 /**
214 * @param mainClass The main class.
215 */
216 public void setMainClass( String mainClass )
217 {
218 this.mainClass = mainClass;
219 }
220
221 /**
222 * @param packageName The package name.
223 */
224 public void setPackageName( String packageName )
225 {
226 this.packageName = packageName;
227 }
228
229 /**
230 * @return The classpath prefix.
231 */
232 public String getClasspathPrefix()
233 {
234 String cpp = classpathPrefix.replaceAll( "\\\\", "/" );
235
236 if ( cpp.length() != 0 && !cpp.endsWith( "/" ) )
237 {
238 cpp += "/";
239 }
240
241 return cpp;
242 }
243
244 /**
245 * Return the type of layout to use when formatting classpath entries. Default is taken from the constant
246 * CLASSPATH_LAYOUT_TYPE_SIMPLE, declared in this class, which has a value of 'simple'. Other values are:
247 * 'repository' (CLASSPATH_LAYOUT_TYPE_REPOSITORY, or the same as a maven classpath layout), and 'custom'
248 * (CLASSPATH_LAYOUT_TYPE_CUSTOM). <br>
249 * <b>NOTE:</b> If you specify a type of 'custom' you MUST set
250 * {@link ManifestConfiguration#setCustomClasspathLayout(String)}.
251 * @return The classpath layout type.
252 */
253 public String getClasspathLayoutType()
254 {
255 return classpathLayoutType;
256 }
257
258 /**
259 * Set the type of layout to use when formatting classpath entries. Should be one of: 'simple'
260 * (CLASSPATH_LAYOUT_TYPE_SIMPLE), 'repository' (CLASSPATH_LAYOUT_TYPE_REPOSITORY, or the same as a maven classpath
261 * layout), and 'custom' (CLASSPATH_LAYOUT_TYPE_CUSTOM). The constant names noted here are defined in the
262 * {@link ManifestConfiguration} class. <br>
263 * <b>NOTE:</b> If you specify a type of 'custom' you MUST set
264 * {@link ManifestConfiguration#setCustomClasspathLayout(String)}.
265 * @param classpathLayoutType The classpath layout type.
266 */
267 public void setClasspathLayoutType( String classpathLayoutType )
268 {
269 this.classpathLayoutType = classpathLayoutType;
270 }
271
272 /**
273 * Retrieve the layout expression for use when the layout type set in
274 * {@link ManifestConfiguration#setClasspathLayoutType(String)} has the value 'custom'. <b>The default value is
275 * null.</b> Expressions will be evaluated against the following ordered list of classpath-related objects:
276 * <ol>
277 * <li>The current {@code Artifact} instance, if one exists.</li>
278 * <li>The current {@code ArtifactHandler} instance from the artifact above.</li>
279 * </ol>
280 * <br>
281 * <b>NOTE:</b> If you specify a layout type of 'custom' you MUST set this layout expression.
282 * @return The custom classpath layout.
283 */
284 public String getCustomClasspathLayout()
285 {
286 return customClasspathLayout;
287 }
288
289 /**
290 * Set the layout expression for use when the layout type set in
291 * {@link ManifestConfiguration#setClasspathLayoutType(String)} has the value 'custom'. Expressions will be
292 * evaluated against the following ordered list of classpath-related objects:
293 * <ol>
294 * <li>The current {@code Artifact} instance, if one exists.</li>
295 * <li>The current {@code ArtifactHandler} instance from the artifact above.</li>
296 * </ol>
297 * <br>
298 * <b>NOTE:</b> If you specify a layout type of 'custom' you MUST set this layout expression.
299 * You can take a look at
300 * <ol>
301 * <li>{@link MavenArchiver#SIMPLE_LAYOUT}</li>
302 * <li>{@link MavenArchiver#SIMPLE_LAYOUT_NONUNIQUE}</li>
303 * <li>{@link MavenArchiver#REPOSITORY_LAYOUT}</li>
304 * <li>{@link MavenArchiver#REPOSITORY_LAYOUT_NONUNIQUE}</li>
305 * </ol>
306 * how such an expression looks like.
307 * @param customClasspathLayout The custom classpath layout.
308 */
309 public void setCustomClasspathLayout( String customClasspathLayout )
310 {
311 this.customClasspathLayout = customClasspathLayout;
312 }
313
314 /**
315 * Retrieve the flag for whether snapshot artifacts should be added to the classpath using the
316 * timestamp/buildnumber version (the default, when this flag is true), or using the generic
317 * -SNAPSHOT version (when the flag is false). <br>
318 * <b>NOTE:</b> If the snapshot was installed locally, this flag will not have an effect on
319 * that artifact's inclusion, since it will have the same version either way (i.e. -SNAPSHOT naming).
320 *
321 * @return The state of {@link #useUniqueVersions}
322 */
323 public boolean isUseUniqueVersions()
324 {
325 return useUniqueVersions;
326 }
327
328 /**
329 * Set the flag for whether snapshot artifacts should be added to the classpath using the timestamp/buildnumber
330 * version (the default, when this flag is true), or using the generic -SNAPSHOT version (when the flag is false).
331 * <br>
332 * <b>NOTE:</b> If the snapshot was installed locally, this flag will not have an effect on that artifact's
333 * inclusion, since it will have the same version either way (i.e. -SNAPSHOT naming).
334 * @param useUniqueVersions true to use unique versions or not.
335 */
336 public void setUseUniqueVersions( boolean useUniqueVersions )
337 {
338 this.useUniqueVersions = useUniqueVersions;
339 }
340 }