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