View Javadoc

1   package org.apache.maven.plugin.assembly.mojos;
2   
3   import java.util.ArrayList;
4   import java.util.Iterator;
5   import java.util.List;
6   
7   import org.apache.maven.plugin.AbstractMojo;
8   import org.apache.maven.plugin.MojoExecutionException;
9   
10  /**
11   * Display help information on maven-assembly-plugin.<br/> Call <pre>  mvn assembly:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</pre> to display parameter details.
12   *
13   * @version generated on Tue Nov 29 12:00:52 EST 2011
14   * @author org.apache.maven.tools.plugin.generator.PluginHelpGenerator (version 2.7)
15   * @goal help
16   * @requiresProject false
17   * @threadSafe
18   */
19  public class HelpMojo
20      extends AbstractMojo
21  {
22      /**
23       * If <code>true</code>, display all settable properties for each goal.
24       * 
25       * @parameter expression="${detail}" default-value="false"
26       */
27      private boolean detail;
28  
29      /**
30       * The name of the goal for which to show help. If unspecified, all goals will be displayed.
31       * 
32       * @parameter expression="${goal}"
33       */
34      private java.lang.String goal;
35  
36      /**
37       * The maximum length of a display line, should be positive.
38       * 
39       * @parameter expression="${lineLength}" default-value="80"
40       */
41      private int lineLength;
42  
43      /**
44       * The number of spaces per indentation level, should be positive.
45       * 
46       * @parameter expression="${indentSize}" default-value="2"
47       */
48      private int indentSize;
49  
50  
51      /** {@inheritDoc} */
52      public void execute()
53          throws MojoExecutionException
54      {
55          if ( lineLength <= 0 )
56          {
57              getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." );
58              lineLength = 80;
59          }
60          if ( indentSize <= 0 )
61          {
62              getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." );
63              indentSize = 2;
64          }
65  
66          StringBuffer sb = new StringBuffer();
67  
68          append( sb, "org.apache.maven.plugins:maven-assembly-plugin:2.2.2", 0 );
69          append( sb, "", 0 );
70  
71          append( sb, "Maven Assembly Plugin", 0 );
72          append( sb, "A Maven plugin to create archives of your project\'s sources, classes, dependencies etc. from flexible assembly descriptors.", 1 );
73          append( sb, "", 0 );
74  
75          if ( goal == null || goal.length() <= 0 )
76          {
77              append( sb, "This plugin has 8 goals:", 0 );
78              append( sb, "", 0 );
79          }
80  
81          if ( goal == null || goal.length() <= 0 || "assembly".equals( goal ) )
82          {
83              append( sb, "assembly:assembly", 0 );
84              append( sb, "Deprecated. Use assembly:single instead! The assembly:assembly mojo leads to non-standard builds.", 1 );
85              if ( detail )
86              {
87                  append( sb, "", 0 );
88                  append( sb, "Assemble an application bundle or distribution using an assembly descriptor from the command line. This goal will force Maven to build all included POMs up to the package phase BEFORE the assembly is processed.\nNOTE: This goal should ONLY be run from the command line, and if building a multimodule project it should be used from the root POM. Use the assembly:single goal for binding your assembly to the lifecycle.\n", 1 );
89              }
90              append( sb, "", 0 );
91              if ( detail )
92              {
93                  append( sb, "Available parameters:", 1 );
94                  append( sb, "", 0 );
95  
96                  append( sb, "appendAssemblyId (Default: true)", 2 );
97                  append( sb, "Set to false to exclude the assembly id from the assembly final name.", 3 );
98                  append( sb, "Expression: ${assembly.appendAssemblyId}", 3 );
99                  append( sb, "", 0 );
100 
101                 append( sb, "archive", 2 );
102                 append( sb, "This is a set of instructions to the archive builder, especially for building .jar files. It enables you to specify a Manifest file for the jar, in addition to other options.", 3 );
103                 append( sb, "", 0 );
104 
105                 append( sb, "archiveBaseDirectory", 2 );
106                 append( sb, "This is the base directory from which archive files are created. This base directory pre-pended to any <directory> specifications in the assembly descriptor. This is an optional parameter.", 3 );
107                 append( sb, "", 0 );
108 
109                 append( sb, "archiverConfig", 2 );
110                 append( sb, "Allows additional configuration options that are specific to a particular type of archive format. This is intended to capture an XML configuration that will be used to reflectively setup the options on the archiver instance.\nFor instance, to direct an assembly with the \'ear\' format to use a particular deployment descriptor, you should specify the following for the archiverConfig value in your plugin configuration:\n\n<appxml>${project.basedir}/somepath/app.xml</appxml>\n", 3 );
111                 append( sb, "", 0 );
112 
113                 append( sb, "attach (Default: true)", 2 );
114                 append( sb, "Controls whether the assembly plugin tries to attach the resulting assembly to the project.", 3 );
115                 append( sb, "Expression: ${assembly.attach}", 3 );
116                 append( sb, "", 0 );
117 
118                 append( sb, "classifier", 2 );
119                 append( sb, "Deprecated. Please use the Assembly\'s id for classifier instead", 3 );
120                 append( sb, "", 0 );
121                 append( sb, "This is the artifact classifier to be used for the resultant assembly artifact. Normally, you would use the assembly-id instead of specifying this here.", 3 );
122                 append( sb, "Expression: ${classifier}", 3 );
123                 append( sb, "", 0 );
124 
125                 append( sb, "descriptor", 2 );
126                 append( sb, "Deprecated. Please use descriptors instead", 3 );
127                 append( sb, "", 0 );
128                 append( sb, "Assembly XML Descriptor file. This must be the path to your customized descriptor file.", 3 );
129                 append( sb, "Expression: ${descriptor}", 3 );
130                 append( sb, "", 0 );
131 
132                 append( sb, "descriptorId", 2 );
133                 append( sb, "Deprecated. Please use descriptorRefs instead", 3 );
134                 append( sb, "", 0 );
135                 append( sb, "Predefined Assembly Descriptor Id\'s. You can select bin, jar-with-dependencies, or src.", 3 );
136                 append( sb, "Expression: ${descriptorId}", 3 );
137                 append( sb, "", 0 );
138 
139                 append( sb, "descriptorRefs", 2 );
140                 append( sb, "A list of references to assembly descriptors available on the plugin\'s classpath. The default classpath includes these built-in descriptors: bin, jar-with-dependencies, src, and project. You can add others by adding dependencies to the plugin.", 3 );
141                 append( sb, "", 0 );
142 
143                 append( sb, "descriptors", 2 );
144                 append( sb, "A list of descriptor files to generate from.", 3 );
145                 append( sb, "", 0 );
146 
147                 append( sb, "descriptorSourceDirectory", 2 );
148                 append( sb, "Directory to scan for descriptor files in. NOTE: This may not work correctly with assembly components.", 3 );
149                 append( sb, "", 0 );
150 
151                 append( sb, "dryRun (Default: false)", 2 );
152                 append( sb, "If this flag is set, everything up to the call to Archiver.createArchive() will be executed.", 3 );
153                 append( sb, "Expression: ${assembly.dryRun}", 3 );
154                 append( sb, "", 0 );
155 
156                 append( sb, "encoding (Default: ${project.build.sourceEncoding})", 2 );
157                 append( sb, "The character encoding scheme to be applied when filtering resources.", 3 );
158                 append( sb, "Expression: ${encoding}", 3 );
159                 append( sb, "", 0 );
160 
161                 append( sb, "executedProject", 2 );
162                 append( sb, "Get the executed project from the forked lifecycle.", 3 );
163                 append( sb, "Expression: ${executedProject}", 3 );
164                 append( sb, "", 0 );
165 
166                 append( sb, "filters", 2 );
167                 append( sb, "(no description available)", 3 );
168                 append( sb, "", 0 );
169 
170                 append( sb, "finalName (Default: ${project.build.finalName})", 2 );
171                 append( sb, "The filename of the assembled distribution file.", 3 );
172                 append( sb, "Required: Yes", 3 );
173                 append( sb, "", 0 );
174 
175                 append( sb, "formats", 2 );
176                 append( sb, "(no description available)", 3 );
177                 append( sb, "", 0 );
178 
179                 append( sb, "ignoreDirFormatExtensions (Default: true)", 2 );
180                 append( sb, "If this flag is set, the \'.dir\' suffix will be suppressed in the output directory name when using assembly/format == \'dir\' and other formats that begin with \'dir\'.\nNOTE: Since 2.2-beta-3, the default-value for this is true, NOT false as it used to be.", 3 );
181                 append( sb, "", 0 );
182 
183                 append( sb, "ignoreMissingDescriptor (Default: false)", 2 );
184                 append( sb, "Set to true in order to not fail when a descriptor is missing.", 3 );
185                 append( sb, "Expression: ${assembly.ignoreMissingDescriptor}", 3 );
186                 append( sb, "", 0 );
187 
188                 append( sb, "ignorePermissions (Default: false)", 2 );
189                 append( sb, "Set to true in order to avoid all chmod calls.\n\nNOTE: This will cause the assembly plugin to DISREGARD all fileMode/directoryMode settings in the assembly descriptor, and all file permissions in unpacked dependencies!\n", 3 );
190                 append( sb, "Expression: ${assembly.ignorePermissions}", 3 );
191                 append( sb, "", 0 );
192 
193                 append( sb, "includeSite (Default: false)", 2 );
194                 append( sb, "Deprecated. Please set this variable in the assembly descriptor instead", 3 );
195                 append( sb, "", 0 );
196                 append( sb, "Set to true to include the site generated by site:site goal.", 3 );
197                 append( sb, "Expression: ${includeSite}", 3 );
198                 append( sb, "", 0 );
199 
200                 append( sb, "outputDirectory (Default: ${project.build.directory})", 2 );
201                 append( sb, "The output directory of the assembled distribution file.", 3 );
202                 append( sb, "Required: Yes", 3 );
203                 append( sb, "", 0 );
204 
205                 append( sb, "runOnlyAtExecutionRoot (Default: false)", 2 );
206                 append( sb, "This will cause the assembly to run only at the top of a given module tree. That is, run in the project contained in the same folder where the mvn execution was launched.", 3 );
207                 append( sb, "Expression: ${assembly.runOnlyAtExecutionRoot}", 3 );
208                 append( sb, "", 0 );
209 
210                 append( sb, "skipAssembly (Default: false)", 2 );
211                 append( sb, "Flag allowing one or more executions of the assembly plugin to be configured as skipped for a particular build. This makes the assembly plugin more controllable from profiles.", 3 );
212                 append( sb, "Expression: ${assembly.skipAssembly}", 3 );
213                 append( sb, "", 0 );
214 
215                 append( sb, "tarLongFileMode (Default: warn)", 2 );
216                 append( sb, "Sets the TarArchiver behavior on file paths with more than 100 characters length. Valid values are: \'warn\' (default), \'fail\', \'truncate\', \'gnu\', or \'omit\'.", 3 );
217                 append( sb, "Expression: ${assembly.tarLongFileMode}", 3 );
218                 append( sb, "", 0 );
219 
220                 append( sb, "updateOnly (Default: false)", 2 );
221                 append( sb, "This will cause the assembly to only update an existing archive, if it exists.", 3 );
222                 append( sb, "Expression: ${assembly.updatOnly}", 3 );
223                 append( sb, "", 0 );
224 
225                 append( sb, "useJvmChmod (Default: false)", 2 );
226                 append( sb, "will use the jvm chmod, this is available for user and all level group level will be ignored\n", 3 );
227                 append( sb, "Expression: ${assembly.useJvmChmod}", 3 );
228                 append( sb, "", 0 );
229 
230                 append( sb, "workDirectory (Default: ${project.build.directory}/assembly/work)", 2 );
231                 append( sb, "Directory to unpack JARs into if needed", 3 );
232                 append( sb, "Required: Yes", 3 );
233                 append( sb, "", 0 );
234             }
235         }
236 
237         if ( goal == null || goal.length() <= 0 || "attached".equals( goal ) )
238         {
239             append( sb, "assembly:attached", 0 );
240             append( sb, "Deprecated. Use assembly:single instead! The assembly:attached mojo leads to non-standard builds.", 1 );
241             if ( detail )
242             {
243                 append( sb, "", 0 );
244                 append( sb, "Assemble an application bundle or distribution from an assembly descriptor, WITHOUT first forcing Maven to build all POMs to the package phase (as is required by the assembly:assembly goal).\nNOTE: This goal should ONLY be run from the command line, and if building a multimodule project it should be used from the root POM. Use the assembly:single goal for binding your assembly to the lifecycle.", 1 );
245             }
246             append( sb, "", 0 );
247             if ( detail )
248             {
249                 append( sb, "Available parameters:", 1 );
250                 append( sb, "", 0 );
251 
252                 append( sb, "appendAssemblyId (Default: true)", 2 );
253                 append( sb, "Set to false to exclude the assembly id from the assembly final name.", 3 );
254                 append( sb, "Expression: ${assembly.appendAssemblyId}", 3 );
255                 append( sb, "", 0 );
256 
257                 append( sb, "archive", 2 );
258                 append( sb, "This is a set of instructions to the archive builder, especially for building .jar files. It enables you to specify a Manifest file for the jar, in addition to other options.", 3 );
259                 append( sb, "", 0 );
260 
261                 append( sb, "archiveBaseDirectory", 2 );
262                 append( sb, "This is the base directory from which archive files are created. This base directory pre-pended to any <directory> specifications in the assembly descriptor. This is an optional parameter.", 3 );
263                 append( sb, "", 0 );
264 
265                 append( sb, "archiverConfig", 2 );
266                 append( sb, "Allows additional configuration options that are specific to a particular type of archive format. This is intended to capture an XML configuration that will be used to reflectively setup the options on the archiver instance.\nFor instance, to direct an assembly with the \'ear\' format to use a particular deployment descriptor, you should specify the following for the archiverConfig value in your plugin configuration:\n\n<appxml>${project.basedir}/somepath/app.xml</appxml>\n", 3 );
267                 append( sb, "", 0 );
268 
269                 append( sb, "attach (Default: true)", 2 );
270                 append( sb, "Controls whether the assembly plugin tries to attach the resulting assembly to the project.", 3 );
271                 append( sb, "Expression: ${assembly.attach}", 3 );
272                 append( sb, "", 0 );
273 
274                 append( sb, "classifier", 2 );
275                 append( sb, "Deprecated. Please use the Assembly\'s id for classifier instead", 3 );
276                 append( sb, "", 0 );
277                 append( sb, "This is the artifact classifier to be used for the resultant assembly artifact. Normally, you would use the assembly-id instead of specifying this here.", 3 );
278                 append( sb, "Expression: ${classifier}", 3 );
279                 append( sb, "", 0 );
280 
281                 append( sb, "descriptor", 2 );
282                 append( sb, "Deprecated. Please use descriptors instead", 3 );
283                 append( sb, "", 0 );
284                 append( sb, "Assembly XML Descriptor file. This must be the path to your customized descriptor file.", 3 );
285                 append( sb, "Expression: ${descriptor}", 3 );
286                 append( sb, "", 0 );
287 
288                 append( sb, "descriptorId", 2 );
289                 append( sb, "Deprecated. Please use descriptorRefs instead", 3 );
290                 append( sb, "", 0 );
291                 append( sb, "Predefined Assembly Descriptor Id\'s. You can select bin, jar-with-dependencies, or src.", 3 );
292                 append( sb, "Expression: ${descriptorId}", 3 );
293                 append( sb, "", 0 );
294 
295                 append( sb, "descriptorRefs", 2 );
296                 append( sb, "A list of references to assembly descriptors available on the plugin\'s classpath. The default classpath includes these built-in descriptors: bin, jar-with-dependencies, src, and project. You can add others by adding dependencies to the plugin.", 3 );
297                 append( sb, "", 0 );
298 
299                 append( sb, "descriptors", 2 );
300                 append( sb, "A list of descriptor files to generate from.", 3 );
301                 append( sb, "", 0 );
302 
303                 append( sb, "descriptorSourceDirectory", 2 );
304                 append( sb, "Directory to scan for descriptor files in. NOTE: This may not work correctly with assembly components.", 3 );
305                 append( sb, "", 0 );
306 
307                 append( sb, "dryRun (Default: false)", 2 );
308                 append( sb, "If this flag is set, everything up to the call to Archiver.createArchive() will be executed.", 3 );
309                 append( sb, "Expression: ${assembly.dryRun}", 3 );
310                 append( sb, "", 0 );
311 
312                 append( sb, "encoding (Default: ${project.build.sourceEncoding})", 2 );
313                 append( sb, "The character encoding scheme to be applied when filtering resources.", 3 );
314                 append( sb, "Expression: ${encoding}", 3 );
315                 append( sb, "", 0 );
316 
317                 append( sb, "filters", 2 );
318                 append( sb, "(no description available)", 3 );
319                 append( sb, "", 0 );
320 
321                 append( sb, "finalName (Default: ${project.build.finalName})", 2 );
322                 append( sb, "The filename of the assembled distribution file.", 3 );
323                 append( sb, "Required: Yes", 3 );
324                 append( sb, "", 0 );
325 
326                 append( sb, "formats", 2 );
327                 append( sb, "(no description available)", 3 );
328                 append( sb, "", 0 );
329 
330                 append( sb, "ignoreDirFormatExtensions (Default: true)", 2 );
331                 append( sb, "If this flag is set, the \'.dir\' suffix will be suppressed in the output directory name when using assembly/format == \'dir\' and other formats that begin with \'dir\'.\nNOTE: Since 2.2-beta-3, the default-value for this is true, NOT false as it used to be.", 3 );
332                 append( sb, "", 0 );
333 
334                 append( sb, "ignoreMissingDescriptor (Default: false)", 2 );
335                 append( sb, "Set to true in order to not fail when a descriptor is missing.", 3 );
336                 append( sb, "Expression: ${assembly.ignoreMissingDescriptor}", 3 );
337                 append( sb, "", 0 );
338 
339                 append( sb, "ignorePermissions (Default: false)", 2 );
340                 append( sb, "Set to true in order to avoid all chmod calls.\n\nNOTE: This will cause the assembly plugin to DISREGARD all fileMode/directoryMode settings in the assembly descriptor, and all file permissions in unpacked dependencies!\n", 3 );
341                 append( sb, "Expression: ${assembly.ignorePermissions}", 3 );
342                 append( sb, "", 0 );
343 
344                 append( sb, "includeSite (Default: false)", 2 );
345                 append( sb, "Deprecated. Please set this variable in the assembly descriptor instead", 3 );
346                 append( sb, "", 0 );
347                 append( sb, "Set to true to include the site generated by site:site goal.", 3 );
348                 append( sb, "Expression: ${includeSite}", 3 );
349                 append( sb, "", 0 );
350 
351                 append( sb, "outputDirectory (Default: ${project.build.directory})", 2 );
352                 append( sb, "The output directory of the assembled distribution file.", 3 );
353                 append( sb, "Required: Yes", 3 );
354                 append( sb, "", 0 );
355 
356                 append( sb, "runOnlyAtExecutionRoot (Default: false)", 2 );
357                 append( sb, "This will cause the assembly to run only at the top of a given module tree. That is, run in the project contained in the same folder where the mvn execution was launched.", 3 );
358                 append( sb, "Expression: ${assembly.runOnlyAtExecutionRoot}", 3 );
359                 append( sb, "", 0 );
360 
361                 append( sb, "skipAssembly (Default: false)", 2 );
362                 append( sb, "Flag allowing one or more executions of the assembly plugin to be configured as skipped for a particular build. This makes the assembly plugin more controllable from profiles.", 3 );
363                 append( sb, "Expression: ${assembly.skipAssembly}", 3 );
364                 append( sb, "", 0 );
365 
366                 append( sb, "tarLongFileMode (Default: warn)", 2 );
367                 append( sb, "Sets the TarArchiver behavior on file paths with more than 100 characters length. Valid values are: \'warn\' (default), \'fail\', \'truncate\', \'gnu\', or \'omit\'.", 3 );
368                 append( sb, "Expression: ${assembly.tarLongFileMode}", 3 );
369                 append( sb, "", 0 );
370 
371                 append( sb, "updateOnly (Default: false)", 2 );
372                 append( sb, "This will cause the assembly to only update an existing archive, if it exists.", 3 );
373                 append( sb, "Expression: ${assembly.updatOnly}", 3 );
374                 append( sb, "", 0 );
375 
376                 append( sb, "useJvmChmod (Default: false)", 2 );
377                 append( sb, "will use the jvm chmod, this is available for user and all level group level will be ignored\n", 3 );
378                 append( sb, "Expression: ${assembly.useJvmChmod}", 3 );
379                 append( sb, "", 0 );
380 
381                 append( sb, "workDirectory (Default: ${project.build.directory}/assembly/work)", 2 );
382                 append( sb, "Directory to unpack JARs into if needed", 3 );
383                 append( sb, "Required: Yes", 3 );
384                 append( sb, "", 0 );
385             }
386         }
387 
388         if ( goal == null || goal.length() <= 0 || "directory".equals( goal ) )
389         {
390             append( sb, "assembly:directory", 0 );
391             append( sb, "Deprecated. Use assembly:single and an assembly with format == dir instead! This mojo is redundant.", 1 );
392             if ( detail )
393             {
394                 append( sb, "", 0 );
395                 append( sb, "Like the assembly:attached goal, assemble an application bundle or distribution using an assembly descriptor from the command line. This goal will force Maven to build all included POMs up to the package phase BEFORE the assembly is processed. This goal differs from assembly:assembly in that it ignores the <formats/> section of the assembly descriptor, and forces the assembly to be created as a directory in the project\'s build-output directory (usually ./target).\nThis goal is also functionally equivalent to using the assembly:assembly goal in conjunction with the dir assembly format.\nNOTE: This goal should ONLY be run from the command line, and if building a multimodule project it should be used from the root POM. Use the assembly:directory-single goal for binding your assembly to the lifecycle.", 1 );
396             }
397             append( sb, "", 0 );
398             if ( detail )
399             {
400                 append( sb, "Available parameters:", 1 );
401                 append( sb, "", 0 );
402 
403                 append( sb, "appendAssemblyId (Default: true)", 2 );
404                 append( sb, "Set to false to exclude the assembly id from the assembly final name.", 3 );
405                 append( sb, "Expression: ${assembly.appendAssemblyId}", 3 );
406                 append( sb, "", 0 );
407 
408                 append( sb, "archive", 2 );
409                 append( sb, "This is a set of instructions to the archive builder, especially for building .jar files. It enables you to specify a Manifest file for the jar, in addition to other options.", 3 );
410                 append( sb, "", 0 );
411 
412                 append( sb, "archiveBaseDirectory", 2 );
413                 append( sb, "This is the base directory from which archive files are created. This base directory pre-pended to any <directory> specifications in the assembly descriptor. This is an optional parameter.", 3 );
414                 append( sb, "", 0 );
415 
416                 append( sb, "archiverConfig", 2 );
417                 append( sb, "Allows additional configuration options that are specific to a particular type of archive format. This is intended to capture an XML configuration that will be used to reflectively setup the options on the archiver instance.\nFor instance, to direct an assembly with the \'ear\' format to use a particular deployment descriptor, you should specify the following for the archiverConfig value in your plugin configuration:\n\n<appxml>${project.basedir}/somepath/app.xml</appxml>\n", 3 );
418                 append( sb, "", 0 );
419 
420                 append( sb, "attach (Default: true)", 2 );
421                 append( sb, "Controls whether the assembly plugin tries to attach the resulting assembly to the project.", 3 );
422                 append( sb, "Expression: ${assembly.attach}", 3 );
423                 append( sb, "", 0 );
424 
425                 append( sb, "classifier", 2 );
426                 append( sb, "Deprecated. Please use the Assembly\'s id for classifier instead", 3 );
427                 append( sb, "", 0 );
428                 append( sb, "This is the artifact classifier to be used for the resultant assembly artifact. Normally, you would use the assembly-id instead of specifying this here.", 3 );
429                 append( sb, "Expression: ${classifier}", 3 );
430                 append( sb, "", 0 );
431 
432                 append( sb, "descriptor", 2 );
433                 append( sb, "Deprecated. Please use descriptors instead", 3 );
434                 append( sb, "", 0 );
435                 append( sb, "Assembly XML Descriptor file. This must be the path to your customized descriptor file.", 3 );
436                 append( sb, "Expression: ${descriptor}", 3 );
437                 append( sb, "", 0 );
438 
439                 append( sb, "descriptorId", 2 );
440                 append( sb, "Deprecated. Please use descriptorRefs instead", 3 );
441                 append( sb, "", 0 );
442                 append( sb, "Predefined Assembly Descriptor Id\'s. You can select bin, jar-with-dependencies, or src.", 3 );
443                 append( sb, "Expression: ${descriptorId}", 3 );
444                 append( sb, "", 0 );
445 
446                 append( sb, "descriptorRefs", 2 );
447                 append( sb, "A list of references to assembly descriptors available on the plugin\'s classpath. The default classpath includes these built-in descriptors: bin, jar-with-dependencies, src, and project. You can add others by adding dependencies to the plugin.", 3 );
448                 append( sb, "", 0 );
449 
450                 append( sb, "descriptors", 2 );
451                 append( sb, "A list of descriptor files to generate from.", 3 );
452                 append( sb, "", 0 );
453 
454                 append( sb, "descriptorSourceDirectory", 2 );
455                 append( sb, "Directory to scan for descriptor files in. NOTE: This may not work correctly with assembly components.", 3 );
456                 append( sb, "", 0 );
457 
458                 append( sb, "dryRun (Default: false)", 2 );
459                 append( sb, "If this flag is set, everything up to the call to Archiver.createArchive() will be executed.", 3 );
460                 append( sb, "Expression: ${assembly.dryRun}", 3 );
461                 append( sb, "", 0 );
462 
463                 append( sb, "encoding (Default: ${project.build.sourceEncoding})", 2 );
464                 append( sb, "The character encoding scheme to be applied when filtering resources.", 3 );
465                 append( sb, "Expression: ${encoding}", 3 );
466                 append( sb, "", 0 );
467 
468                 append( sb, "executedProject", 2 );
469                 append( sb, "Get the executed project from the forked lifecycle.", 3 );
470                 append( sb, "Expression: ${executedProject}", 3 );
471                 append( sb, "", 0 );
472 
473                 append( sb, "filters", 2 );
474                 append( sb, "(no description available)", 3 );
475                 append( sb, "", 0 );
476 
477                 append( sb, "finalName (Default: ${project.build.finalName})", 2 );
478                 append( sb, "The filename of the assembled distribution file.", 3 );
479                 append( sb, "Required: Yes", 3 );
480                 append( sb, "", 0 );
481 
482                 append( sb, "formats", 2 );
483                 append( sb, "(no description available)", 3 );
484                 append( sb, "", 0 );
485 
486                 append( sb, "ignoreDirFormatExtensions (Default: true)", 2 );
487                 append( sb, "If this flag is set, the \'.dir\' suffix will be suppressed in the output directory name when using assembly/format == \'dir\' and other formats that begin with \'dir\'.\nNOTE: Since 2.2-beta-3, the default-value for this is true, NOT false as it used to be.", 3 );
488                 append( sb, "", 0 );
489 
490                 append( sb, "ignoreMissingDescriptor (Default: false)", 2 );
491                 append( sb, "Set to true in order to not fail when a descriptor is missing.", 3 );
492                 append( sb, "Expression: ${assembly.ignoreMissingDescriptor}", 3 );
493                 append( sb, "", 0 );
494 
495                 append( sb, "ignorePermissions (Default: false)", 2 );
496                 append( sb, "Set to true in order to avoid all chmod calls.\n\nNOTE: This will cause the assembly plugin to DISREGARD all fileMode/directoryMode settings in the assembly descriptor, and all file permissions in unpacked dependencies!\n", 3 );
497                 append( sb, "Expression: ${assembly.ignorePermissions}", 3 );
498                 append( sb, "", 0 );
499 
500                 append( sb, "includeSite (Default: false)", 2 );
501                 append( sb, "Deprecated. Please set this variable in the assembly descriptor instead", 3 );
502                 append( sb, "", 0 );
503                 append( sb, "Set to true to include the site generated by site:site goal.", 3 );
504                 append( sb, "Expression: ${includeSite}", 3 );
505                 append( sb, "", 0 );
506 
507                 append( sb, "outputDirectory (Default: ${project.build.directory})", 2 );
508                 append( sb, "The output directory of the assembled distribution file.", 3 );
509                 append( sb, "Required: Yes", 3 );
510                 append( sb, "", 0 );
511 
512                 append( sb, "runOnlyAtExecutionRoot (Default: false)", 2 );
513                 append( sb, "This will cause the assembly to run only at the top of a given module tree. That is, run in the project contained in the same folder where the mvn execution was launched.", 3 );
514                 append( sb, "Expression: ${assembly.runOnlyAtExecutionRoot}", 3 );
515                 append( sb, "", 0 );
516 
517                 append( sb, "skipAssembly (Default: false)", 2 );
518                 append( sb, "Flag allowing one or more executions of the assembly plugin to be configured as skipped for a particular build. This makes the assembly plugin more controllable from profiles.", 3 );
519                 append( sb, "Expression: ${assembly.skipAssembly}", 3 );
520                 append( sb, "", 0 );
521 
522                 append( sb, "tarLongFileMode (Default: warn)", 2 );
523                 append( sb, "Sets the TarArchiver behavior on file paths with more than 100 characters length. Valid values are: \'warn\' (default), \'fail\', \'truncate\', \'gnu\', or \'omit\'.", 3 );
524                 append( sb, "Expression: ${assembly.tarLongFileMode}", 3 );
525                 append( sb, "", 0 );
526 
527                 append( sb, "updateOnly (Default: false)", 2 );
528                 append( sb, "This will cause the assembly to only update an existing archive, if it exists.", 3 );
529                 append( sb, "Expression: ${assembly.updatOnly}", 3 );
530                 append( sb, "", 0 );
531 
532                 append( sb, "useJvmChmod (Default: false)", 2 );
533                 append( sb, "will use the jvm chmod, this is available for user and all level group level will be ignored\n", 3 );
534                 append( sb, "Expression: ${assembly.useJvmChmod}", 3 );
535                 append( sb, "", 0 );
536 
537                 append( sb, "workDirectory (Default: ${project.build.directory}/assembly/work)", 2 );
538                 append( sb, "Directory to unpack JARs into if needed", 3 );
539                 append( sb, "Required: Yes", 3 );
540                 append( sb, "", 0 );
541             }
542         }
543 
544         if ( goal == null || goal.length() <= 0 || "directory-inline".equals( goal ) )
545         {
546             append( sb, "assembly:directory-inline", 0 );
547             append( sb, "Deprecated. Use assembly:single and an assembly with format == dir instead! This mojo is redundant, and leads to non-standard builds.", 1 );
548             if ( detail )
549             {
550                 append( sb, "", 0 );
551                 append( sb, "Like the assembly:attached goal, assemble an application bundle or distribution from an assembly descriptor, WITHOUT first forcing Maven to build all POMs to the package phase (as is required by the assembly:assembly goal). This goal differs from assembly:attached in that it ignores the <formats/> section of the assembly descriptor, and forces the assembly to be created as a directory in the project\'s build-output directory (usually ./target).\nThis goal is also functionally equivalent to using the assembly:attached goal in conjunction with the dir assembly format.\nNOTE: This goal should ONLY be run from the command line, and if building a multimodule project it should be used from the root POM. Use the assembly:directory-single goal for binding your assembly to the lifecycle.", 1 );
552             }
553             append( sb, "", 0 );
554             if ( detail )
555             {
556                 append( sb, "Available parameters:", 1 );
557                 append( sb, "", 0 );
558 
559                 append( sb, "appendAssemblyId (Default: true)", 2 );
560                 append( sb, "Set to false to exclude the assembly id from the assembly final name.", 3 );
561                 append( sb, "Expression: ${assembly.appendAssemblyId}", 3 );
562                 append( sb, "", 0 );
563 
564                 append( sb, "archive", 2 );
565                 append( sb, "This is a set of instructions to the archive builder, especially for building .jar files. It enables you to specify a Manifest file for the jar, in addition to other options.", 3 );
566                 append( sb, "", 0 );
567 
568                 append( sb, "archiveBaseDirectory", 2 );
569                 append( sb, "This is the base directory from which archive files are created. This base directory pre-pended to any <directory> specifications in the assembly descriptor. This is an optional parameter.", 3 );
570                 append( sb, "", 0 );
571 
572                 append( sb, "archiverConfig", 2 );
573                 append( sb, "Allows additional configuration options that are specific to a particular type of archive format. This is intended to capture an XML configuration that will be used to reflectively setup the options on the archiver instance.\nFor instance, to direct an assembly with the \'ear\' format to use a particular deployment descriptor, you should specify the following for the archiverConfig value in your plugin configuration:\n\n<appxml>${project.basedir}/somepath/app.xml</appxml>\n", 3 );
574                 append( sb, "", 0 );
575 
576                 append( sb, "attach (Default: true)", 2 );
577                 append( sb, "Controls whether the assembly plugin tries to attach the resulting assembly to the project.", 3 );
578                 append( sb, "Expression: ${assembly.attach}", 3 );
579                 append( sb, "", 0 );
580 
581                 append( sb, "classifier", 2 );
582                 append( sb, "Deprecated. Please use the Assembly\'s id for classifier instead", 3 );
583                 append( sb, "", 0 );
584                 append( sb, "This is the artifact classifier to be used for the resultant assembly artifact. Normally, you would use the assembly-id instead of specifying this here.", 3 );
585                 append( sb, "Expression: ${classifier}", 3 );
586                 append( sb, "", 0 );
587 
588                 append( sb, "descriptor", 2 );
589                 append( sb, "Deprecated. Please use descriptors instead", 3 );
590                 append( sb, "", 0 );
591                 append( sb, "Assembly XML Descriptor file. This must be the path to your customized descriptor file.", 3 );
592                 append( sb, "Expression: ${descriptor}", 3 );
593                 append( sb, "", 0 );
594 
595                 append( sb, "descriptorId", 2 );
596                 append( sb, "Deprecated. Please use descriptorRefs instead", 3 );
597                 append( sb, "", 0 );
598                 append( sb, "Predefined Assembly Descriptor Id\'s. You can select bin, jar-with-dependencies, or src.", 3 );
599                 append( sb, "Expression: ${descriptorId}", 3 );
600                 append( sb, "", 0 );
601 
602                 append( sb, "descriptorRefs", 2 );
603                 append( sb, "A list of references to assembly descriptors available on the plugin\'s classpath. The default classpath includes these built-in descriptors: bin, jar-with-dependencies, src, and project. You can add others by adding dependencies to the plugin.", 3 );
604                 append( sb, "", 0 );
605 
606                 append( sb, "descriptors", 2 );
607                 append( sb, "A list of descriptor files to generate from.", 3 );
608                 append( sb, "", 0 );
609 
610                 append( sb, "descriptorSourceDirectory", 2 );
611                 append( sb, "Directory to scan for descriptor files in. NOTE: This may not work correctly with assembly components.", 3 );
612                 append( sb, "", 0 );
613 
614                 append( sb, "dryRun (Default: false)", 2 );
615                 append( sb, "If this flag is set, everything up to the call to Archiver.createArchive() will be executed.", 3 );
616                 append( sb, "Expression: ${assembly.dryRun}", 3 );
617                 append( sb, "", 0 );
618 
619                 append( sb, "encoding (Default: ${project.build.sourceEncoding})", 2 );
620                 append( sb, "The character encoding scheme to be applied when filtering resources.", 3 );
621                 append( sb, "Expression: ${encoding}", 3 );
622                 append( sb, "", 0 );
623 
624                 append( sb, "filters", 2 );
625                 append( sb, "(no description available)", 3 );
626                 append( sb, "", 0 );
627 
628                 append( sb, "finalName (Default: ${project.build.finalName})", 2 );
629                 append( sb, "The filename of the assembled distribution file.", 3 );
630                 append( sb, "Required: Yes", 3 );
631                 append( sb, "", 0 );
632 
633                 append( sb, "formats", 2 );
634                 append( sb, "(no description available)", 3 );
635                 append( sb, "", 0 );
636 
637                 append( sb, "ignoreDirFormatExtensions (Default: true)", 2 );
638                 append( sb, "If this flag is set, the \'.dir\' suffix will be suppressed in the output directory name when using assembly/format == \'dir\' and other formats that begin with \'dir\'.\nNOTE: Since 2.2-beta-3, the default-value for this is true, NOT false as it used to be.", 3 );
639                 append( sb, "", 0 );
640 
641                 append( sb, "ignoreMissingDescriptor (Default: false)", 2 );
642                 append( sb, "Set to true in order to not fail when a descriptor is missing.", 3 );
643                 append( sb, "Expression: ${assembly.ignoreMissingDescriptor}", 3 );
644                 append( sb, "", 0 );
645 
646                 append( sb, "ignorePermissions (Default: false)", 2 );
647                 append( sb, "Set to true in order to avoid all chmod calls.\n\nNOTE: This will cause the assembly plugin to DISREGARD all fileMode/directoryMode settings in the assembly descriptor, and all file permissions in unpacked dependencies!\n", 3 );
648                 append( sb, "Expression: ${assembly.ignorePermissions}", 3 );
649                 append( sb, "", 0 );
650 
651                 append( sb, "includeSite (Default: false)", 2 );
652                 append( sb, "Deprecated. Please set this variable in the assembly descriptor instead", 3 );
653                 append( sb, "", 0 );
654                 append( sb, "Set to true to include the site generated by site:site goal.", 3 );
655                 append( sb, "Expression: ${includeSite}", 3 );
656                 append( sb, "", 0 );
657 
658                 append( sb, "outputDirectory (Default: ${project.build.directory})", 2 );
659                 append( sb, "The output directory of the assembled distribution file.", 3 );
660                 append( sb, "Required: Yes", 3 );
661                 append( sb, "", 0 );
662 
663                 append( sb, "runOnlyAtExecutionRoot (Default: false)", 2 );
664                 append( sb, "This will cause the assembly to run only at the top of a given module tree. That is, run in the project contained in the same folder where the mvn execution was launched.", 3 );
665                 append( sb, "Expression: ${assembly.runOnlyAtExecutionRoot}", 3 );
666                 append( sb, "", 0 );
667 
668                 append( sb, "skipAssembly (Default: false)", 2 );
669                 append( sb, "Flag allowing one or more executions of the assembly plugin to be configured as skipped for a particular build. This makes the assembly plugin more controllable from profiles.", 3 );
670                 append( sb, "Expression: ${assembly.skipAssembly}", 3 );
671                 append( sb, "", 0 );
672 
673                 append( sb, "tarLongFileMode (Default: warn)", 2 );
674                 append( sb, "Sets the TarArchiver behavior on file paths with more than 100 characters length. Valid values are: \'warn\' (default), \'fail\', \'truncate\', \'gnu\', or \'omit\'.", 3 );
675                 append( sb, "Expression: ${assembly.tarLongFileMode}", 3 );
676                 append( sb, "", 0 );
677 
678                 append( sb, "updateOnly (Default: false)", 2 );
679                 append( sb, "This will cause the assembly to only update an existing archive, if it exists.", 3 );
680                 append( sb, "Expression: ${assembly.updatOnly}", 3 );
681                 append( sb, "", 0 );
682 
683                 append( sb, "useJvmChmod (Default: false)", 2 );
684                 append( sb, "will use the jvm chmod, this is available for user and all level group level will be ignored\n", 3 );
685                 append( sb, "Expression: ${assembly.useJvmChmod}", 3 );
686                 append( sb, "", 0 );
687 
688                 append( sb, "workDirectory (Default: ${project.build.directory}/assembly/work)", 2 );
689                 append( sb, "Directory to unpack JARs into if needed", 3 );
690                 append( sb, "Required: Yes", 3 );
691                 append( sb, "", 0 );
692             }
693         }
694 
695         if ( goal == null || goal.length() <= 0 || "directory-single".equals( goal ) )
696         {
697             append( sb, "assembly:directory-single", 0 );
698             append( sb, "Deprecated. Use assembly:single and an assembly with format == dir instead! This mojo is redundant.", 1 );
699             if ( detail )
700             {
701                 append( sb, "", 0 );
702                 append( sb, "Like the assembly:attached goal, assemble an application bundle or distribution from an assembly descriptor. This goal is suitable either for binding to the lifecycle or calling directly from the command line (provided all required files are available before the build starts, or are produced by another goal specified before this one on the command line).\nThis goal differs from assembly:single in that it ignores the <formats/> section of the assembly descriptor, and forces the assembly to be created as a directory in the project\'s build-output directory (usually ./target).", 1 );
703             }
704             append( sb, "", 0 );
705             if ( detail )
706             {
707                 append( sb, "Available parameters:", 1 );
708                 append( sb, "", 0 );
709 
710                 append( sb, "appendAssemblyId (Default: true)", 2 );
711                 append( sb, "Set to false to exclude the assembly id from the assembly final name.", 3 );
712                 append( sb, "Expression: ${assembly.appendAssemblyId}", 3 );
713                 append( sb, "", 0 );
714 
715                 append( sb, "archive", 2 );
716                 append( sb, "This is a set of instructions to the archive builder, especially for building .jar files. It enables you to specify a Manifest file for the jar, in addition to other options.", 3 );
717                 append( sb, "", 0 );
718 
719                 append( sb, "archiveBaseDirectory", 2 );
720                 append( sb, "This is the base directory from which archive files are created. This base directory pre-pended to any <directory> specifications in the assembly descriptor. This is an optional parameter.", 3 );
721                 append( sb, "", 0 );
722 
723                 append( sb, "archiverConfig", 2 );
724                 append( sb, "Allows additional configuration options that are specific to a particular type of archive format. This is intended to capture an XML configuration that will be used to reflectively setup the options on the archiver instance.\nFor instance, to direct an assembly with the \'ear\' format to use a particular deployment descriptor, you should specify the following for the archiverConfig value in your plugin configuration:\n\n<appxml>${project.basedir}/somepath/app.xml</appxml>\n", 3 );
725                 append( sb, "", 0 );
726 
727                 append( sb, "attach (Default: true)", 2 );
728                 append( sb, "Controls whether the assembly plugin tries to attach the resulting assembly to the project.", 3 );
729                 append( sb, "Expression: ${assembly.attach}", 3 );
730                 append( sb, "", 0 );
731 
732                 append( sb, "classifier", 2 );
733                 append( sb, "Deprecated. Please use the Assembly\'s id for classifier instead", 3 );
734                 append( sb, "", 0 );
735                 append( sb, "This is the artifact classifier to be used for the resultant assembly artifact. Normally, you would use the assembly-id instead of specifying this here.", 3 );
736                 append( sb, "Expression: ${classifier}", 3 );
737                 append( sb, "", 0 );
738 
739                 append( sb, "descriptor", 2 );
740                 append( sb, "Deprecated. Please use descriptors instead", 3 );
741                 append( sb, "", 0 );
742                 append( sb, "Assembly XML Descriptor file. This must be the path to your customized descriptor file.", 3 );
743                 append( sb, "Expression: ${descriptor}", 3 );
744                 append( sb, "", 0 );
745 
746                 append( sb, "descriptorId", 2 );
747                 append( sb, "Deprecated. Please use descriptorRefs instead", 3 );
748                 append( sb, "", 0 );
749                 append( sb, "Predefined Assembly Descriptor Id\'s. You can select bin, jar-with-dependencies, or src.", 3 );
750                 append( sb, "Expression: ${descriptorId}", 3 );
751                 append( sb, "", 0 );
752 
753                 append( sb, "descriptorRefs", 2 );
754                 append( sb, "A list of references to assembly descriptors available on the plugin\'s classpath. The default classpath includes these built-in descriptors: bin, jar-with-dependencies, src, and project. You can add others by adding dependencies to the plugin.", 3 );
755                 append( sb, "", 0 );
756 
757                 append( sb, "descriptors", 2 );
758                 append( sb, "A list of descriptor files to generate from.", 3 );
759                 append( sb, "", 0 );
760 
761                 append( sb, "descriptorSourceDirectory", 2 );
762                 append( sb, "Directory to scan for descriptor files in. NOTE: This may not work correctly with assembly components.", 3 );
763                 append( sb, "", 0 );
764 
765                 append( sb, "dryRun (Default: false)", 2 );
766                 append( sb, "If this flag is set, everything up to the call to Archiver.createArchive() will be executed.", 3 );
767                 append( sb, "Expression: ${assembly.dryRun}", 3 );
768                 append( sb, "", 0 );
769 
770                 append( sb, "encoding (Default: ${project.build.sourceEncoding})", 2 );
771                 append( sb, "The character encoding scheme to be applied when filtering resources.", 3 );
772                 append( sb, "Expression: ${encoding}", 3 );
773                 append( sb, "", 0 );
774 
775                 append( sb, "filters", 2 );
776                 append( sb, "(no description available)", 3 );
777                 append( sb, "", 0 );
778 
779                 append( sb, "finalName (Default: ${project.build.finalName})", 2 );
780                 append( sb, "The filename of the assembled distribution file.", 3 );
781                 append( sb, "Required: Yes", 3 );
782                 append( sb, "", 0 );
783 
784                 append( sb, "formats", 2 );
785                 append( sb, "(no description available)", 3 );
786                 append( sb, "", 0 );
787 
788                 append( sb, "ignoreDirFormatExtensions (Default: true)", 2 );
789                 append( sb, "If this flag is set, the \'.dir\' suffix will be suppressed in the output directory name when using assembly/format == \'dir\' and other formats that begin with \'dir\'.\nNOTE: Since 2.2-beta-3, the default-value for this is true, NOT false as it used to be.", 3 );
790                 append( sb, "", 0 );
791 
792                 append( sb, "ignoreMissingDescriptor (Default: false)", 2 );
793                 append( sb, "Set to true in order to not fail when a descriptor is missing.", 3 );
794                 append( sb, "Expression: ${assembly.ignoreMissingDescriptor}", 3 );
795                 append( sb, "", 0 );
796 
797                 append( sb, "ignorePermissions (Default: false)", 2 );
798                 append( sb, "Set to true in order to avoid all chmod calls.\n\nNOTE: This will cause the assembly plugin to DISREGARD all fileMode/directoryMode settings in the assembly descriptor, and all file permissions in unpacked dependencies!\n", 3 );
799                 append( sb, "Expression: ${assembly.ignorePermissions}", 3 );
800                 append( sb, "", 0 );
801 
802                 append( sb, "includeSite (Default: false)", 2 );
803                 append( sb, "Deprecated. Please set this variable in the assembly descriptor instead", 3 );
804                 append( sb, "", 0 );
805                 append( sb, "Set to true to include the site generated by site:site goal.", 3 );
806                 append( sb, "Expression: ${includeSite}", 3 );
807                 append( sb, "", 0 );
808 
809                 append( sb, "outputDirectory (Default: ${project.build.directory})", 2 );
810                 append( sb, "The output directory of the assembled distribution file.", 3 );
811                 append( sb, "Required: Yes", 3 );
812                 append( sb, "", 0 );
813 
814                 append( sb, "runOnlyAtExecutionRoot (Default: false)", 2 );
815                 append( sb, "This will cause the assembly to run only at the top of a given module tree. That is, run in the project contained in the same folder where the mvn execution was launched.", 3 );
816                 append( sb, "Expression: ${assembly.runOnlyAtExecutionRoot}", 3 );
817                 append( sb, "", 0 );
818 
819                 append( sb, "skipAssembly (Default: false)", 2 );
820                 append( sb, "Flag allowing one or more executions of the assembly plugin to be configured as skipped for a particular build. This makes the assembly plugin more controllable from profiles.", 3 );
821                 append( sb, "Expression: ${assembly.skipAssembly}", 3 );
822                 append( sb, "", 0 );
823 
824                 append( sb, "tarLongFileMode (Default: warn)", 2 );
825                 append( sb, "Sets the TarArchiver behavior on file paths with more than 100 characters length. Valid values are: \'warn\' (default), \'fail\', \'truncate\', \'gnu\', or \'omit\'.", 3 );
826                 append( sb, "Expression: ${assembly.tarLongFileMode}", 3 );
827                 append( sb, "", 0 );
828 
829                 append( sb, "updateOnly (Default: false)", 2 );
830                 append( sb, "This will cause the assembly to only update an existing archive, if it exists.", 3 );
831                 append( sb, "Expression: ${assembly.updatOnly}", 3 );
832                 append( sb, "", 0 );
833 
834                 append( sb, "useJvmChmod (Default: false)", 2 );
835                 append( sb, "will use the jvm chmod, this is available for user and all level group level will be ignored\n", 3 );
836                 append( sb, "Expression: ${assembly.useJvmChmod}", 3 );
837                 append( sb, "", 0 );
838 
839                 append( sb, "workDirectory (Default: ${project.build.directory}/assembly/work)", 2 );
840                 append( sb, "Directory to unpack JARs into if needed", 3 );
841                 append( sb, "Required: Yes", 3 );
842                 append( sb, "", 0 );
843             }
844         }
845 
846         if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
847         {
848             append( sb, "assembly:help", 0 );
849             append( sb, "Display help information on maven-assembly-plugin.\nCall\n\u00a0\u00a0mvn\u00a0assembly:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
850             append( sb, "", 0 );
851             if ( detail )
852             {
853                 append( sb, "Available parameters:", 1 );
854                 append( sb, "", 0 );
855 
856                 append( sb, "detail (Default: false)", 2 );
857                 append( sb, "If true, display all settable properties for each goal.", 3 );
858                 append( sb, "Expression: ${detail}", 3 );
859                 append( sb, "", 0 );
860 
861                 append( sb, "goal", 2 );
862                 append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
863                 append( sb, "Expression: ${goal}", 3 );
864                 append( sb, "", 0 );
865 
866                 append( sb, "indentSize (Default: 2)", 2 );
867                 append( sb, "The number of spaces per indentation level, should be positive.", 3 );
868                 append( sb, "Expression: ${indentSize}", 3 );
869                 append( sb, "", 0 );
870 
871                 append( sb, "lineLength (Default: 80)", 2 );
872                 append( sb, "The maximum length of a display line, should be positive.", 3 );
873                 append( sb, "Expression: ${lineLength}", 3 );
874                 append( sb, "", 0 );
875             }
876         }
877 
878         if ( goal == null || goal.length() <= 0 || "single".equals( goal ) )
879         {
880             append( sb, "assembly:single", 0 );
881             append( sb, "Assemble an application bundle or distribution from an assembly descriptor. This goal is suitable either for binding to the lifecycle or calling directly from the command line (provided all required files are available before the build starts, or are produced by another goal specified before this one on the command line).", 1 );
882             append( sb, "", 0 );
883             if ( detail )
884             {
885                 append( sb, "Available parameters:", 1 );
886                 append( sb, "", 0 );
887 
888                 append( sb, "appendAssemblyId (Default: true)", 2 );
889                 append( sb, "Set to false to exclude the assembly id from the assembly final name.", 3 );
890                 append( sb, "Expression: ${assembly.appendAssemblyId}", 3 );
891                 append( sb, "", 0 );
892 
893                 append( sb, "archive", 2 );
894                 append( sb, "This is a set of instructions to the archive builder, especially for building .jar files. It enables you to specify a Manifest file for the jar, in addition to other options.", 3 );
895                 append( sb, "", 0 );
896 
897                 append( sb, "archiveBaseDirectory", 2 );
898                 append( sb, "This is the base directory from which archive files are created. This base directory pre-pended to any <directory> specifications in the assembly descriptor. This is an optional parameter.", 3 );
899                 append( sb, "", 0 );
900 
901                 append( sb, "archiverConfig", 2 );
902                 append( sb, "Allows additional configuration options that are specific to a particular type of archive format. This is intended to capture an XML configuration that will be used to reflectively setup the options on the archiver instance.\nFor instance, to direct an assembly with the \'ear\' format to use a particular deployment descriptor, you should specify the following for the archiverConfig value in your plugin configuration:\n\n<appxml>${project.basedir}/somepath/app.xml</appxml>\n", 3 );
903                 append( sb, "", 0 );
904 
905                 append( sb, "attach (Default: true)", 2 );
906                 append( sb, "Controls whether the assembly plugin tries to attach the resulting assembly to the project.", 3 );
907                 append( sb, "Expression: ${assembly.attach}", 3 );
908                 append( sb, "", 0 );
909 
910                 append( sb, "classifier", 2 );
911                 append( sb, "Deprecated. Please use the Assembly\'s id for classifier instead", 3 );
912                 append( sb, "", 0 );
913                 append( sb, "This is the artifact classifier to be used for the resultant assembly artifact. Normally, you would use the assembly-id instead of specifying this here.", 3 );
914                 append( sb, "Expression: ${classifier}", 3 );
915                 append( sb, "", 0 );
916 
917                 append( sb, "descriptor", 2 );
918                 append( sb, "Deprecated. Please use descriptors instead", 3 );
919                 append( sb, "", 0 );
920                 append( sb, "Assembly XML Descriptor file. This must be the path to your customized descriptor file.", 3 );
921                 append( sb, "Expression: ${descriptor}", 3 );
922                 append( sb, "", 0 );
923 
924                 append( sb, "descriptorId", 2 );
925                 append( sb, "Deprecated. Please use descriptorRefs instead", 3 );
926                 append( sb, "", 0 );
927                 append( sb, "Predefined Assembly Descriptor Id\'s. You can select bin, jar-with-dependencies, or src.", 3 );
928                 append( sb, "Expression: ${descriptorId}", 3 );
929                 append( sb, "", 0 );
930 
931                 append( sb, "descriptorRefs", 2 );
932                 append( sb, "A list of references to assembly descriptors available on the plugin\'s classpath. The default classpath includes these built-in descriptors: bin, jar-with-dependencies, src, and project. You can add others by adding dependencies to the plugin.", 3 );
933                 append( sb, "", 0 );
934 
935                 append( sb, "descriptors", 2 );
936                 append( sb, "A list of descriptor files to generate from.", 3 );
937                 append( sb, "", 0 );
938 
939                 append( sb, "descriptorSourceDirectory", 2 );
940                 append( sb, "Directory to scan for descriptor files in. NOTE: This may not work correctly with assembly components.", 3 );
941                 append( sb, "", 0 );
942 
943                 append( sb, "dryRun (Default: false)", 2 );
944                 append( sb, "If this flag is set, everything up to the call to Archiver.createArchive() will be executed.", 3 );
945                 append( sb, "Expression: ${assembly.dryRun}", 3 );
946                 append( sb, "", 0 );
947 
948                 append( sb, "encoding (Default: ${project.build.sourceEncoding})", 2 );
949                 append( sb, "The character encoding scheme to be applied when filtering resources.", 3 );
950                 append( sb, "Expression: ${encoding}", 3 );
951                 append( sb, "", 0 );
952 
953                 append( sb, "filters", 2 );
954                 append( sb, "(no description available)", 3 );
955                 append( sb, "", 0 );
956 
957                 append( sb, "finalName (Default: ${project.build.finalName})", 2 );
958                 append( sb, "The filename of the assembled distribution file.", 3 );
959                 append( sb, "Required: Yes", 3 );
960                 append( sb, "", 0 );
961 
962                 append( sb, "formats", 2 );
963                 append( sb, "(no description available)", 3 );
964                 append( sb, "", 0 );
965 
966                 append( sb, "ignoreDirFormatExtensions (Default: true)", 2 );
967                 append( sb, "If this flag is set, the \'.dir\' suffix will be suppressed in the output directory name when using assembly/format == \'dir\' and other formats that begin with \'dir\'.\nNOTE: Since 2.2-beta-3, the default-value for this is true, NOT false as it used to be.", 3 );
968                 append( sb, "", 0 );
969 
970                 append( sb, "ignoreMissingDescriptor (Default: false)", 2 );
971                 append( sb, "Set to true in order to not fail when a descriptor is missing.", 3 );
972                 append( sb, "Expression: ${assembly.ignoreMissingDescriptor}", 3 );
973                 append( sb, "", 0 );
974 
975                 append( sb, "ignorePermissions (Default: false)", 2 );
976                 append( sb, "Set to true in order to avoid all chmod calls.\n\nNOTE: This will cause the assembly plugin to DISREGARD all fileMode/directoryMode settings in the assembly descriptor, and all file permissions in unpacked dependencies!\n", 3 );
977                 append( sb, "Expression: ${assembly.ignorePermissions}", 3 );
978                 append( sb, "", 0 );
979 
980                 append( sb, "includeSite (Default: false)", 2 );
981                 append( sb, "Deprecated. Please set this variable in the assembly descriptor instead", 3 );
982                 append( sb, "", 0 );
983                 append( sb, "Set to true to include the site generated by site:site goal.", 3 );
984                 append( sb, "Expression: ${includeSite}", 3 );
985                 append( sb, "", 0 );
986 
987                 append( sb, "outputDirectory (Default: ${project.build.directory})", 2 );
988                 append( sb, "The output directory of the assembled distribution file.", 3 );
989                 append( sb, "Required: Yes", 3 );
990                 append( sb, "", 0 );
991 
992                 append( sb, "runOnlyAtExecutionRoot (Default: false)", 2 );
993                 append( sb, "This will cause the assembly to run only at the top of a given module tree. That is, run in the project contained in the same folder where the mvn execution was launched.", 3 );
994                 append( sb, "Expression: ${assembly.runOnlyAtExecutionRoot}", 3 );
995                 append( sb, "", 0 );
996 
997                 append( sb, "skipAssembly (Default: false)", 2 );
998                 append( sb, "Flag allowing one or more executions of the assembly plugin to be configured as skipped for a particular build. This makes the assembly plugin more controllable from profiles.", 3 );
999                 append( sb, "Expression: ${assembly.skipAssembly}", 3 );
1000                 append( sb, "", 0 );
1001 
1002                 append( sb, "tarLongFileMode (Default: warn)", 2 );
1003                 append( sb, "Sets the TarArchiver behavior on file paths with more than 100 characters length. Valid values are: \'warn\' (default), \'fail\', \'truncate\', \'gnu\', or \'omit\'.", 3 );
1004                 append( sb, "Expression: ${assembly.tarLongFileMode}", 3 );
1005                 append( sb, "", 0 );
1006 
1007                 append( sb, "updateOnly (Default: false)", 2 );
1008                 append( sb, "This will cause the assembly to only update an existing archive, if it exists.", 3 );
1009                 append( sb, "Expression: ${assembly.updatOnly}", 3 );
1010                 append( sb, "", 0 );
1011 
1012                 append( sb, "useJvmChmod (Default: false)", 2 );
1013                 append( sb, "will use the jvm chmod, this is available for user and all level group level will be ignored\n", 3 );
1014                 append( sb, "Expression: ${assembly.useJvmChmod}", 3 );
1015                 append( sb, "", 0 );
1016 
1017                 append( sb, "workDirectory (Default: ${project.build.directory}/assembly/work)", 2 );
1018                 append( sb, "Directory to unpack JARs into if needed", 3 );
1019                 append( sb, "Required: Yes", 3 );
1020                 append( sb, "", 0 );
1021             }
1022         }
1023 
1024         if ( goal == null || goal.length() <= 0 || "unpack".equals( goal ) )
1025         {
1026             append( sb, "assembly:unpack", 0 );
1027             append( sb, "Deprecated. Use org.apache.maven.plugins:maven-dependency-plugin goal: unpack or unpack-dependencies instead.", 1 );
1028             if ( detail )
1029             {
1030                 append( sb, "", 0 );
1031                 append( sb, "Unpack project dependencies. Currently supports dependencies of type jar and zip.", 1 );
1032             }
1033             append( sb, "", 0 );
1034             if ( detail )
1035             {
1036                 append( sb, "Available parameters:", 1 );
1037                 append( sb, "", 0 );
1038 
1039                 append( sb, "workDirectory", 2 );
1040                 append( sb, "Directory to unpack JARs into if needed", 3 );
1041                 append( sb, "Required: Yes", 3 );
1042                 append( sb, "Expression: ${project.build.directory}/assembly/work", 3 );
1043                 append( sb, "", 0 );
1044             }
1045         }
1046 
1047         if ( getLog().isInfoEnabled() )
1048         {
1049             getLog().info( sb.toString() );
1050         }
1051     }
1052 
1053     /**
1054      * <p>Repeat a String <code>n</code> times to form a new string.</p>
1055      *
1056      * @param str String to repeat
1057      * @param repeat number of times to repeat str
1058      * @return String with repeated String
1059      * @throws NegativeArraySizeException if <code>repeat < 0</code>
1060      * @throws NullPointerException if str is <code>null</code>
1061      */
1062     private static String repeat( String str, int repeat )
1063     {
1064         StringBuffer buffer = new StringBuffer( repeat * str.length() );
1065 
1066         for ( int i = 0; i < repeat; i++ )
1067         {
1068             buffer.append( str );
1069         }
1070 
1071         return buffer.toString();
1072     }
1073 
1074     /** 
1075      * Append a description to the buffer by respecting the indentSize and lineLength parameters.
1076      * <b>Note</b>: The last character is always a new line.
1077      * 
1078      * @param sb The buffer to append the description, not <code>null</code>.
1079      * @param description The description, not <code>null</code>.
1080      * @param indent The base indentation level of each line, must not be negative.
1081      */
1082     private void append( StringBuffer sb, String description, int indent )
1083     {
1084         for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
1085         {
1086             sb.append( it.next().toString() ).append( '\n' );
1087         }
1088     }
1089 
1090     /** 
1091      * Splits the specified text into lines of convenient display length.
1092      * 
1093      * @param text The text to split into lines, must not be <code>null</code>.
1094      * @param indent The base indentation level of each line, must not be negative.
1095      * @param indentSize The size of each indentation, must not be negative.
1096      * @param lineLength The length of the line, must not be negative.
1097      * @return The sequence of display lines, never <code>null</code>.
1098      * @throws NegativeArraySizeException if <code>indent < 0</code>
1099      */
1100     private static List toLines( String text, int indent, int indentSize, int lineLength )
1101     {
1102         List lines = new ArrayList();
1103 
1104         String ind = repeat( "\t", indent );
1105         String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
1106         for ( int i = 0; i < plainLines.length; i++ )
1107         {
1108             toLines( lines, ind + plainLines[i], indentSize, lineLength );
1109         }
1110 
1111         return lines;
1112     }
1113 
1114     /** 
1115      * Adds the specified line to the output sequence, performing line wrapping if necessary.
1116      * 
1117      * @param lines The sequence of display lines, must not be <code>null</code>.
1118      * @param line The line to add, must not be <code>null</code>.
1119      * @param indentSize The size of each indentation, must not be negative.
1120      * @param lineLength The length of the line, must not be negative.
1121      */
1122     private static void toLines( List lines, String line, int indentSize, int lineLength )
1123     {
1124         int lineIndent = getIndentLevel( line );
1125         StringBuffer buf = new StringBuffer( 256 );
1126         String[] tokens = line.split( " +" );
1127         for ( int i = 0; i < tokens.length; i++ )
1128         {
1129             String token = tokens[i];
1130             if ( i > 0 )
1131             {
1132                 if ( buf.length() + token.length() >= lineLength )
1133                 {
1134                     lines.add( buf.toString() );
1135                     buf.setLength( 0 );
1136                     buf.append( repeat( " ", lineIndent * indentSize ) );
1137                 }
1138                 else
1139                 {
1140                     buf.append( ' ' );
1141                 }
1142             }
1143             for ( int j = 0; j < token.length(); j++ )
1144             {
1145                 char c = token.charAt( j );
1146                 if ( c == '\t' )
1147                 {
1148                     buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
1149                 }
1150                 else if ( c == '\u00A0' )
1151                 {
1152                     buf.append( ' ' );
1153                 }
1154                 else
1155                 {
1156                     buf.append( c );
1157                 }
1158             }
1159         }
1160         lines.add( buf.toString() );
1161     }
1162 
1163     /** 
1164      * Gets the indentation level of the specified line.
1165      * 
1166      * @param line The line whose indentation level should be retrieved, must not be <code>null</code>.
1167      * @return The indentation level of the line.
1168      */
1169     private static int getIndentLevel( String line )
1170     {
1171         int level = 0;
1172         for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
1173         {
1174             level++;
1175         }
1176         for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
1177         {
1178             if ( line.charAt( i ) == '\t' )
1179             {
1180                 level++;
1181                 break;
1182             }
1183         }
1184         return level;
1185     }
1186 }