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