--- /dev/null
+++ b/src/main/filtered-resources/META-INF/maven/org.apache.maven.plugins/maven-resources-plugin/plugin-help.xml
@@ -0,0 +1,701 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Generated by maven-plugin-tools 4.0 (for help mojo with limited elements)-->
+
+<plugin>
+  <name>${project.name}</name>
+  <description>${project.description}</description>
+  <groupId>${project.groupId}</groupId>
+  <artifactId>${project.artifactId}</artifactId>
+  <version>${project.version}</version>
+  <goalPrefix>resources</goalPrefix>
+  <mojos>
+    <mojo>
+      <goal>copy-resources</goal>
+      <description>Copy resources of the configured plugin attribute resources</description>
+      <requiresDirectInvocation>false</requiresDirectInvocation>
+      <requiresProject>true</requiresProject>
+      <requiresReports>false</requiresReports>
+      <aggregator>false</aggregator>
+      <requiresOnline>false</requiresOnline>
+      <inheritedByDefault>true</inheritedByDefault>
+      <implementation>org.apache.maven.plugins.resources.CopyResourcesMojo</implementation>
+      <language>java</language>
+      <instantiationStrategy>per-lookup</instantiationStrategy>
+      <executionStrategy>once-per-session</executionStrategy>
+      <since>2.3</since>
+      <threadSafe>true</threadSafe>
+      <parameters>
+        <parameter>
+          <name>addDefaultExcludes</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>By default files like .gitignore, .cvsignore etc. are excluded which means they will not being copied. If you need them for a particular reason you can do that by settings this to false. This means all files like the following will be copied. 
+* Misc: **/*~, **/#*#, **/.#*, **/%*%, **/._* 
+* CVS: **/CVS, **/CVS/**, **/.cvsignore 
+* RCS: **/RCS, **/RCS/** 
+* SCCS: **/SCCS, **/SCCS/** 
+* VSSercer: **/vssver.scc 
+* MKS: **/project.pj 
+* SVN: **/.svn, **/.svn/** 
+* GNU: **/.arch-ids, **/.arch-ids/** 
+* Bazaar: **/.bzr, **/.bzr/** 
+* SurroundSCM: **/.MySCMServerInfo 
+* Mac: **/.DS_Store 
+* Serena Dimension: **/.metadata, **/.metadata/** 
+* Mercurial: **/.hg, **/.hg/** 
+* Git: **/.git, **/.git/** 
+* Bitkeeper: **/BitKeeper, **/BitKeeper/**, **/ChangeSet, **/ChangeSet/** 
+* Darcs: **/_darcs, **/_darcs/**, **/.darcsrepo, **/.darcsrepo/****/-darcs-backup*, **/.darcs-temp-mail </description>
+        </parameter>
+        <parameter>
+          <name>changeDetection</name>
+          <type>java.lang.String</type>
+          <since>3.5.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The strategy to use for change detection. Supported values are listed below. If this parameter is configured, it will override the value of overwrite. Strategies and their behavior are as follows: 
+* content: This is the default strategy since version 3.4.0. Overwrites existing target file only if content differs. 
+* timestamp: This was the default strategy before version 3.4.0. Overwrites existing target file only if target timestamp is older than source timestamp. 
+* timestamp+content: Combines the two strategies above; if timestamp is older and if content differs, existing target file will be overwritten. 
+* always: Always overwrites existing target file. Equivalent of overwrite=true. 
+* never: Never overwrites existing target file. Note: default value of this parameter is handled programmatically (as &quot;content&quot;) for programmatic detection reasons.</description>
+        </parameter>
+        <parameter>
+          <name>delimiters</name>
+          <type>java.util.LinkedHashSet&lt;java.lang.String&gt;</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+Set of delimiters for expressions to filter within the resources. These delimiters are specified in the form beginToken*endToken. If no * is given, the delimiter is assumed to be the same for start and end.
+
+So, the default filtering delimiters might be specified as:
+&lt;delimiters&gt; &lt;delimiter&gt;${*}&lt;/delimiter&gt; &lt;delimiter&gt;@&lt;/delimiter&gt; &lt;/delimiters&gt; 
+Since the @ delimiter is the same on both ends, we don&apos;t need to specify @*@ (though we can).
+</description>
+        </parameter>
+        <parameter>
+          <name>encoding</name>
+          <type>java.lang.String</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered resources.</description>
+        </parameter>
+        <parameter>
+          <name>escapeString</name>
+          <type>java.lang.String</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Expressions preceded with this string won&apos;t be interpolated. Anything else preceded with this string will be passed through unchanged. For example \${foo} will be replaced with ${foo} but \\${foo} will be replaced with \\value of foo, if this parameter has been set to the backslash.</description>
+        </parameter>
+        <parameter>
+          <name>escapeWindowsPaths</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Whether to escape backslashes and colons in windows-style paths.</description>
+        </parameter>
+        <parameter>
+          <name>fileNameFiltering</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Support filtering of filenames folders etc.</description>
+        </parameter>
+        <parameter>
+          <name>filters</name>
+          <type>java.util.List&lt;java.lang.String&gt;</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+The list of extra filter properties files to be used along with System properties, project properties, and filter properties files specified in the POM build/filters section, which should be used for the filtering during the current mojo execution.
+
+Normally, these will be configured from a plugin&apos;s execution section, to provide a different set of filters for a particular execution. For instance, starting in Maven 2.2.0, you have the option of configuring executions with the id&apos;s default-resources and default-testResources to supply different configurations for the two different types of resources. By supplying extraFilters configurations, you can separate which filters are used for which type of resource.
+</description>
+        </parameter>
+        <parameter>
+          <name>includeEmptyDirs</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Copy any empty directories included in the Resources.</description>
+        </parameter>
+        <parameter>
+          <name>mavenFilteringHints</name>
+          <type>java.util.List&lt;java.lang.String&gt;</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+List of plexus components hint which implements org.apache.maven.shared.filtering.MavenResourcesFiltering.filterResources(org.apache.maven.shared.filtering.MavenResourcesExecution). They will be executed after the resources copying/filtering.
+</description>
+        </parameter>
+        <parameter>
+          <name>nonFilteredFileExtensions</name>
+          <type>java.util.List&lt;java.lang.String&gt;</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Additional file extensions to not apply filtering (already defined are : jpg, jpeg, gif, bmp, png)</description>
+        </parameter>
+        <parameter>
+          <name>outputDirectory</name>
+          <type>java.io.File</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The output directory into which to copy the resources.</description>
+        </parameter>
+        <parameter>
+          <name>overwrite</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <deprecated>Use changeDetection instead.</deprecated>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Overwrite existing files even if the destination files are newer.</description>
+        </parameter>
+        <parameter>
+          <name>propertiesEncoding</name>
+          <type>java.lang.String</type>
+          <since>3.2.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered properties files. If not specified, it will default to the value of the &quot;encoding&quot; parameter.</description>
+        </parameter>
+        <parameter>
+          <name>resources</name>
+          <type>java.util.List&lt;org.apache.maven.model.Resource&gt;</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The list of resources we want to transfer. See the Maven Model for a description of how to code the resources element.</description>
+        </parameter>
+        <parameter>
+          <name>skip</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>You can skip the execution of the plugin if you need to. Its use is NOT RECOMMENDED, but quite convenient on occasion.</description>
+        </parameter>
+        <parameter>
+          <name>supportMultiLineFiltering</name>
+          <type>boolean</type>
+          <since>2.5</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>stop searching endToken at the end of line</description>
+        </parameter>
+        <parameter>
+          <name>useBuildFilters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>If false, don&apos;t use the filters specified in the build/filters section of the POM when processing resources in this mojo execution.
+See also: buildFilters, filters</description>
+        </parameter>
+        <parameter>
+          <name>useDefaultDelimiters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Use default delimiters in addition to custom delimiters, if any.</description>
+        </parameter>
+      </parameters>
+      <configuration>
+        <addDefaultExcludes implementation="boolean" default-value="true"/>
+        <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}"/>
+        <escapeWindowsPaths implementation="boolean" default-value="true"/>
+        <fileNameFiltering implementation="boolean" default-value="false"/>
+        <includeEmptyDirs implementation="boolean" default-value="false"/>
+        <overwrite implementation="boolean" default-value="false"/>
+        <skip implementation="boolean" default-value="false">${maven.resources.skip}</skip>
+        <supportMultiLineFiltering implementation="boolean" default-value="false"/>
+        <useBuildFilters implementation="boolean" default-value="true"/>
+        <useDefaultDelimiters implementation="boolean" default-value="true"/>
+      </configuration>
+    </mojo>
+    <mojo>
+      <goal>help</goal>
+      <description>Display help information on maven-resources-plugin.
+Call mvn resources:help -Ddetail=true -Dgoal=&lt;goal-name&gt; to display parameter details.</description>
+      <requiresDirectInvocation>false</requiresDirectInvocation>
+      <requiresProject>false</requiresProject>
+      <requiresReports>false</requiresReports>
+      <aggregator>false</aggregator>
+      <requiresOnline>false</requiresOnline>
+      <inheritedByDefault>true</inheritedByDefault>
+      <implementation>org.apache.maven.plugins.maven_resources_plugin.HelpMojo</implementation>
+      <language>java</language>
+      <instantiationStrategy>per-lookup</instantiationStrategy>
+      <executionStrategy>once-per-session</executionStrategy>
+      <threadSafe>true</threadSafe>
+      <parameters>
+        <parameter>
+          <name>detail</name>
+          <type>boolean</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>If true, display all settable properties for each goal.</description>
+        </parameter>
+        <parameter>
+          <name>goal</name>
+          <type>java.lang.String</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The name of the goal for which to show help. If unspecified, all goals will be displayed.</description>
+        </parameter>
+        <parameter>
+          <name>indentSize</name>
+          <type>int</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The number of spaces per indentation level, should be positive.</description>
+        </parameter>
+        <parameter>
+          <name>lineLength</name>
+          <type>int</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The maximum length of a display line, should be positive.</description>
+        </parameter>
+      </parameters>
+      <configuration>
+        <detail implementation="boolean" default-value="false">${detail}</detail>
+        <goal implementation="java.lang.String">${goal}</goal>
+        <indentSize implementation="int" default-value="2">${indentSize}</indentSize>
+        <lineLength implementation="int" default-value="80">${lineLength}</lineLength>
+      </configuration>
+    </mojo>
+    <mojo>
+      <goal>resources</goal>
+      <description>Copy resources for the main source code to the main output directory. Always uses the project.build.resources element to specify the resources to copy.</description>
+      <requiresDirectInvocation>false</requiresDirectInvocation>
+      <requiresProject>true</requiresProject>
+      <requiresReports>false</requiresReports>
+      <aggregator>false</aggregator>
+      <requiresOnline>false</requiresOnline>
+      <inheritedByDefault>true</inheritedByDefault>
+      <phase>process-resources</phase>
+      <implementation>org.apache.maven.plugins.resources.ResourcesMojo</implementation>
+      <language>java</language>
+      <instantiationStrategy>per-lookup</instantiationStrategy>
+      <executionStrategy>once-per-session</executionStrategy>
+      <threadSafe>true</threadSafe>
+      <parameters>
+        <parameter>
+          <name>addDefaultExcludes</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>By default files like .gitignore, .cvsignore etc. are excluded which means they will not being copied. If you need them for a particular reason you can do that by settings this to false. This means all files like the following will be copied. 
+* Misc: **/*~, **/#*#, **/.#*, **/%*%, **/._* 
+* CVS: **/CVS, **/CVS/**, **/.cvsignore 
+* RCS: **/RCS, **/RCS/** 
+* SCCS: **/SCCS, **/SCCS/** 
+* VSSercer: **/vssver.scc 
+* MKS: **/project.pj 
+* SVN: **/.svn, **/.svn/** 
+* GNU: **/.arch-ids, **/.arch-ids/** 
+* Bazaar: **/.bzr, **/.bzr/** 
+* SurroundSCM: **/.MySCMServerInfo 
+* Mac: **/.DS_Store 
+* Serena Dimension: **/.metadata, **/.metadata/** 
+* Mercurial: **/.hg, **/.hg/** 
+* Git: **/.git, **/.git/** 
+* Bitkeeper: **/BitKeeper, **/BitKeeper/**, **/ChangeSet, **/ChangeSet/** 
+* Darcs: **/_darcs, **/_darcs/**, **/.darcsrepo, **/.darcsrepo/****/-darcs-backup*, **/.darcs-temp-mail </description>
+        </parameter>
+        <parameter>
+          <name>changeDetection</name>
+          <type>java.lang.String</type>
+          <since>3.5.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The strategy to use for change detection. Supported values are listed below. If this parameter is configured, it will override the value of overwrite. Strategies and their behavior are as follows: 
+* content: This is the default strategy since version 3.4.0. Overwrites existing target file only if content differs. 
+* timestamp: This was the default strategy before version 3.4.0. Overwrites existing target file only if target timestamp is older than source timestamp. 
+* timestamp+content: Combines the two strategies above; if timestamp is older and if content differs, existing target file will be overwritten. 
+* always: Always overwrites existing target file. Equivalent of overwrite=true. 
+* never: Never overwrites existing target file. Note: default value of this parameter is handled programmatically (as &quot;content&quot;) for programmatic detection reasons.</description>
+        </parameter>
+        <parameter>
+          <name>delimiters</name>
+          <type>java.util.LinkedHashSet&lt;java.lang.String&gt;</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+Set of delimiters for expressions to filter within the resources. These delimiters are specified in the form beginToken*endToken. If no * is given, the delimiter is assumed to be the same for start and end.
+
+So, the default filtering delimiters might be specified as:
+&lt;delimiters&gt; &lt;delimiter&gt;${*}&lt;/delimiter&gt; &lt;delimiter&gt;@&lt;/delimiter&gt; &lt;/delimiters&gt; 
+Since the @ delimiter is the same on both ends, we don&apos;t need to specify @*@ (though we can).
+</description>
+        </parameter>
+        <parameter>
+          <name>encoding</name>
+          <type>java.lang.String</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered resources.</description>
+        </parameter>
+        <parameter>
+          <name>escapeString</name>
+          <type>java.lang.String</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Expressions preceded with this string won&apos;t be interpolated. Anything else preceded with this string will be passed through unchanged. For example \${foo} will be replaced with ${foo} but \\${foo} will be replaced with \\value of foo, if this parameter has been set to the backslash.</description>
+        </parameter>
+        <parameter>
+          <name>escapeWindowsPaths</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Whether to escape backslashes and colons in windows-style paths.</description>
+        </parameter>
+        <parameter>
+          <name>fileNameFiltering</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Support filtering of filenames folders etc.</description>
+        </parameter>
+        <parameter>
+          <name>filters</name>
+          <type>java.util.List&lt;java.lang.String&gt;</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+The list of extra filter properties files to be used along with System properties, project properties, and filter properties files specified in the POM build/filters section, which should be used for the filtering during the current mojo execution.
+
+Normally, these will be configured from a plugin&apos;s execution section, to provide a different set of filters for a particular execution. For instance, starting in Maven 2.2.0, you have the option of configuring executions with the id&apos;s default-resources and default-testResources to supply different configurations for the two different types of resources. By supplying extraFilters configurations, you can separate which filters are used for which type of resource.
+</description>
+        </parameter>
+        <parameter>
+          <name>includeEmptyDirs</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Copy any empty directories included in the Resources.</description>
+        </parameter>
+        <parameter>
+          <name>mavenFilteringHints</name>
+          <type>java.util.List&lt;java.lang.String&gt;</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+List of plexus components hint which implements org.apache.maven.shared.filtering.MavenResourcesFiltering.filterResources(org.apache.maven.shared.filtering.MavenResourcesExecution). They will be executed after the resources copying/filtering.
+</description>
+        </parameter>
+        <parameter>
+          <name>nonFilteredFileExtensions</name>
+          <type>java.util.List&lt;java.lang.String&gt;</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Additional file extensions to not apply filtering (already defined are : jpg, jpeg, gif, bmp, png)</description>
+        </parameter>
+        <parameter>
+          <name>outputDirectory</name>
+          <type>java.io.File</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The output directory into which to copy the resources.</description>
+        </parameter>
+        <parameter>
+          <name>overwrite</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <deprecated>Use changeDetection instead.</deprecated>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Overwrite existing files even if the destination files are newer.</description>
+        </parameter>
+        <parameter>
+          <name>propertiesEncoding</name>
+          <type>java.lang.String</type>
+          <since>3.2.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered properties files. If not specified, it will default to the value of the &quot;encoding&quot; parameter.</description>
+        </parameter>
+        <parameter>
+          <name>skip</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>You can skip the execution of the plugin if you need to. Its use is NOT RECOMMENDED, but quite convenient on occasion.</description>
+        </parameter>
+        <parameter>
+          <name>supportMultiLineFiltering</name>
+          <type>boolean</type>
+          <since>2.5</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>stop searching endToken at the end of line</description>
+        </parameter>
+        <parameter>
+          <name>useBuildFilters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>If false, don&apos;t use the filters specified in the build/filters section of the POM when processing resources in this mojo execution.
+See also: buildFilters, filters</description>
+        </parameter>
+        <parameter>
+          <name>useDefaultDelimiters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Use default delimiters in addition to custom delimiters, if any.</description>
+        </parameter>
+      </parameters>
+      <configuration>
+        <addDefaultExcludes implementation="boolean" default-value="true"/>
+        <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}"/>
+        <escapeWindowsPaths implementation="boolean" default-value="true"/>
+        <fileNameFiltering implementation="boolean" default-value="false"/>
+        <includeEmptyDirs implementation="boolean" default-value="false"/>
+        <outputDirectory implementation="java.io.File" default-value="${project.build.outputDirectory}"/>
+        <overwrite implementation="boolean" default-value="false"/>
+        <skip implementation="boolean" default-value="false">${maven.resources.skip}</skip>
+        <supportMultiLineFiltering implementation="boolean" default-value="false"/>
+        <useBuildFilters implementation="boolean" default-value="true"/>
+        <useDefaultDelimiters implementation="boolean" default-value="true"/>
+      </configuration>
+    </mojo>
+    <mojo>
+      <goal>testResources</goal>
+      <description>Copy resources for the test source code to the test output directory. Always uses the project.build.testResources element to specify the resources to copy.</description>
+      <requiresDirectInvocation>false</requiresDirectInvocation>
+      <requiresProject>true</requiresProject>
+      <requiresReports>false</requiresReports>
+      <aggregator>false</aggregator>
+      <requiresOnline>false</requiresOnline>
+      <inheritedByDefault>true</inheritedByDefault>
+      <phase>process-test-resources</phase>
+      <implementation>org.apache.maven.plugins.resources.TestResourcesMojo</implementation>
+      <language>java</language>
+      <instantiationStrategy>per-lookup</instantiationStrategy>
+      <executionStrategy>once-per-session</executionStrategy>
+      <threadSafe>true</threadSafe>
+      <parameters>
+        <parameter>
+          <name>addDefaultExcludes</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>By default files like .gitignore, .cvsignore etc. are excluded which means they will not being copied. If you need them for a particular reason you can do that by settings this to false. This means all files like the following will be copied. 
+* Misc: **/*~, **/#*#, **/.#*, **/%*%, **/._* 
+* CVS: **/CVS, **/CVS/**, **/.cvsignore 
+* RCS: **/RCS, **/RCS/** 
+* SCCS: **/SCCS, **/SCCS/** 
+* VSSercer: **/vssver.scc 
+* MKS: **/project.pj 
+* SVN: **/.svn, **/.svn/** 
+* GNU: **/.arch-ids, **/.arch-ids/** 
+* Bazaar: **/.bzr, **/.bzr/** 
+* SurroundSCM: **/.MySCMServerInfo 
+* Mac: **/.DS_Store 
+* Serena Dimension: **/.metadata, **/.metadata/** 
+* Mercurial: **/.hg, **/.hg/** 
+* Git: **/.git, **/.git/** 
+* Bitkeeper: **/BitKeeper, **/BitKeeper/**, **/ChangeSet, **/ChangeSet/** 
+* Darcs: **/_darcs, **/_darcs/**, **/.darcsrepo, **/.darcsrepo/****/-darcs-backup*, **/.darcs-temp-mail </description>
+        </parameter>
+        <parameter>
+          <name>changeDetection</name>
+          <type>java.lang.String</type>
+          <since>3.5.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The strategy to use for change detection. Supported values are listed below. If this parameter is configured, it will override the value of overwrite. Strategies and their behavior are as follows: 
+* content: This is the default strategy since version 3.4.0. Overwrites existing target file only if content differs. 
+* timestamp: This was the default strategy before version 3.4.0. Overwrites existing target file only if target timestamp is older than source timestamp. 
+* timestamp+content: Combines the two strategies above; if timestamp is older and if content differs, existing target file will be overwritten. 
+* always: Always overwrites existing target file. Equivalent of overwrite=true. 
+* never: Never overwrites existing target file. Note: default value of this parameter is handled programmatically (as &quot;content&quot;) for programmatic detection reasons.</description>
+        </parameter>
+        <parameter>
+          <name>delimiters</name>
+          <type>java.util.LinkedHashSet&lt;java.lang.String&gt;</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+Set of delimiters for expressions to filter within the resources. These delimiters are specified in the form beginToken*endToken. If no * is given, the delimiter is assumed to be the same for start and end.
+
+So, the default filtering delimiters might be specified as:
+&lt;delimiters&gt; &lt;delimiter&gt;${*}&lt;/delimiter&gt; &lt;delimiter&gt;@&lt;/delimiter&gt; &lt;/delimiters&gt; 
+Since the @ delimiter is the same on both ends, we don&apos;t need to specify @*@ (though we can).
+</description>
+        </parameter>
+        <parameter>
+          <name>encoding</name>
+          <type>java.lang.String</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered resources.</description>
+        </parameter>
+        <parameter>
+          <name>escapeString</name>
+          <type>java.lang.String</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Expressions preceded with this string won&apos;t be interpolated. Anything else preceded with this string will be passed through unchanged. For example \${foo} will be replaced with ${foo} but \\${foo} will be replaced with \\value of foo, if this parameter has been set to the backslash.</description>
+        </parameter>
+        <parameter>
+          <name>escapeWindowsPaths</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Whether to escape backslashes and colons in windows-style paths.</description>
+        </parameter>
+        <parameter>
+          <name>fileNameFiltering</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Support filtering of filenames folders etc.</description>
+        </parameter>
+        <parameter>
+          <name>filters</name>
+          <type>java.util.List&lt;java.lang.String&gt;</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+The list of extra filter properties files to be used along with System properties, project properties, and filter properties files specified in the POM build/filters section, which should be used for the filtering during the current mojo execution.
+
+Normally, these will be configured from a plugin&apos;s execution section, to provide a different set of filters for a particular execution. For instance, starting in Maven 2.2.0, you have the option of configuring executions with the id&apos;s default-resources and default-testResources to supply different configurations for the two different types of resources. By supplying extraFilters configurations, you can separate which filters are used for which type of resource.
+</description>
+        </parameter>
+        <parameter>
+          <name>includeEmptyDirs</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Copy any empty directories included in the Resources.</description>
+        </parameter>
+        <parameter>
+          <name>mavenFilteringHints</name>
+          <type>java.util.List&lt;java.lang.String&gt;</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+List of plexus components hint which implements org.apache.maven.shared.filtering.MavenResourcesFiltering.filterResources(org.apache.maven.shared.filtering.MavenResourcesExecution). They will be executed after the resources copying/filtering.
+</description>
+        </parameter>
+        <parameter>
+          <name>nonFilteredFileExtensions</name>
+          <type>java.util.List&lt;java.lang.String&gt;</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Additional file extensions to not apply filtering (already defined are : jpg, jpeg, gif, bmp, png)</description>
+        </parameter>
+        <parameter>
+          <name>outputDirectory</name>
+          <type>java.io.File</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The output directory into which to copy the resources.</description>
+        </parameter>
+        <parameter>
+          <name>overwrite</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <deprecated>Use changeDetection instead.</deprecated>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Overwrite existing files even if the destination files are newer.</description>
+        </parameter>
+        <parameter>
+          <name>propertiesEncoding</name>
+          <type>java.lang.String</type>
+          <since>3.2.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered properties files. If not specified, it will default to the value of the &quot;encoding&quot; parameter.</description>
+        </parameter>
+        <parameter>
+          <name>resources</name>
+          <type>java.util.List&lt;org.apache.maven.model.Resource&gt;</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The list of resources we want to transfer.</description>
+        </parameter>
+        <parameter>
+          <name>skip</name>
+          <type>boolean</type>
+          <since>2.6</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Set this to &apos;true&apos; to bypass copying of test resources. Its use is NOT RECOMMENDED, but quite convenient on occasion.</description>
+        </parameter>
+        <parameter>
+          <name>supportMultiLineFiltering</name>
+          <type>boolean</type>
+          <since>2.5</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>stop searching endToken at the end of line</description>
+        </parameter>
+        <parameter>
+          <name>useBuildFilters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>If false, don&apos;t use the filters specified in the build/filters section of the POM when processing resources in this mojo execution.
+See also: buildFilters, filters</description>
+        </parameter>
+        <parameter>
+          <name>useDefaultDelimiters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Use default delimiters in addition to custom delimiters, if any.</description>
+        </parameter>
+      </parameters>
+      <configuration>
+        <addDefaultExcludes implementation="boolean" default-value="true"/>
+        <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}"/>
+        <escapeWindowsPaths implementation="boolean" default-value="true"/>
+        <fileNameFiltering implementation="boolean" default-value="false"/>
+        <includeEmptyDirs implementation="boolean" default-value="false"/>
+        <outputDirectory implementation="java.io.File" default-value="${project.build.testOutputDirectory}"/>
+        <overwrite implementation="boolean" default-value="false"/>
+        <resources implementation="java.util.List" default-value="${project.testResources}"/>
+        <skip implementation="boolean" default-value="false">${maven.test.skip}</skip>
+        <supportMultiLineFiltering implementation="boolean" default-value="false"/>
+        <useBuildFilters implementation="boolean" default-value="true"/>
+        <useDefaultDelimiters implementation="boolean" default-value="true"/>
+      </configuration>
+    </mojo>
+  </mojos>
+</plugin>
--- /dev/null
+++ b/src/main/filtered-resources/META-INF/maven/plugin.xml
@@ -0,0 +1,841 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Generated by maven-plugin-tools 4.0-->
+
+<plugin>
+  <name>${project.name}</name>
+  <description>${project.description}</description>
+  <groupId>${project.groupId}</groupId>
+  <artifactId>${project.artifactId}</artifactId>
+  <version>${project.version}</version>
+  <goalPrefix>resources</goalPrefix>
+  <isolatedRealm>false</isolatedRealm>
+  <inheritedByDefault>true</inheritedByDefault>
+  <requiredJavaVersion>1.8</requiredJavaVersion>
+  <requiredMavenVersion>3.6.3</requiredMavenVersion>
+  <mojos>
+    <mojo>
+      <goal>copy-resources</goal>
+      <description>Copy resources of the configured plugin attribute resources</description>
+      <requiresDirectInvocation>false</requiresDirectInvocation>
+      <requiresProject>true</requiresProject>
+      <requiresReports>false</requiresReports>
+      <aggregator>false</aggregator>
+      <requiresOnline>false</requiresOnline>
+      <inheritedByDefault>true</inheritedByDefault>
+      <implementation>org.apache.maven.plugins.resources.CopyResourcesMojo</implementation>
+      <language>java</language>
+      <instantiationStrategy>per-lookup</instantiationStrategy>
+      <executionStrategy>once-per-session</executionStrategy>
+      <since>2.3</since>
+      <threadSafe>true</threadSafe>
+      <parameters>
+        <parameter>
+          <name>addDefaultExcludes</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>By default files like .gitignore, .cvsignore etc. are excluded which means they will not being copied. If you need them for a particular reason you can do that by settings this to false. This means all files like the following will be copied. 
+* Misc: **/*~, **/#*#, **/.#*, **/%*%, **/._* 
+* CVS: **/CVS, **/CVS/**, **/.cvsignore 
+* RCS: **/RCS, **/RCS/** 
+* SCCS: **/SCCS, **/SCCS/** 
+* VSSercer: **/vssver.scc 
+* MKS: **/project.pj 
+* SVN: **/.svn, **/.svn/** 
+* GNU: **/.arch-ids, **/.arch-ids/** 
+* Bazaar: **/.bzr, **/.bzr/** 
+* SurroundSCM: **/.MySCMServerInfo 
+* Mac: **/.DS_Store 
+* Serena Dimension: **/.metadata, **/.metadata/** 
+* Mercurial: **/.hg, **/.hg/** 
+* Git: **/.git, **/.git/** 
+* Bitkeeper: **/BitKeeper, **/BitKeeper/**, **/ChangeSet, **/ChangeSet/** 
+* Darcs: **/_darcs, **/_darcs/**, **/.darcsrepo, **/.darcsrepo/****/-darcs-backup*, **/.darcs-temp-mail </description>
+        </parameter>
+        <parameter>
+          <name>buildFilters</name>
+          <type>java.util.List</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>false</editable>
+          <description>The list of additional filter properties files to be used along with System and project properties, which would be used for the filtering.
+See also: filters</description>
+        </parameter>
+        <parameter>
+          <name>changeDetection</name>
+          <type>java.lang.String</type>
+          <since>3.5.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The strategy to use for change detection. Supported values are listed below. If this parameter is configured, it will override the value of overwrite. Strategies and their behavior are as follows: 
+* content: This is the default strategy since version 3.4.0. Overwrites existing target file only if content differs. 
+* timestamp: This was the default strategy before version 3.4.0. Overwrites existing target file only if target timestamp is older than source timestamp. 
+* timestamp+content: Combines the two strategies above; if timestamp is older and if content differs, existing target file will be overwritten. 
+* always: Always overwrites existing target file. Equivalent of overwrite=true. 
+* never: Never overwrites existing target file. Note: default value of this parameter is handled programmatically (as &quot;content&quot;) for programmatic detection reasons.</description>
+        </parameter>
+        <parameter>
+          <name>delimiters</name>
+          <type>java.util.LinkedHashSet</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+Set of delimiters for expressions to filter within the resources. These delimiters are specified in the form beginToken*endToken. If no * is given, the delimiter is assumed to be the same for start and end.
+
+So, the default filtering delimiters might be specified as:
+&lt;delimiters&gt; &lt;delimiter&gt;${*}&lt;/delimiter&gt; &lt;delimiter&gt;@&lt;/delimiter&gt; &lt;/delimiters&gt; 
+Since the @ delimiter is the same on both ends, we don&apos;t need to specify @*@ (though we can).
+</description>
+        </parameter>
+        <parameter>
+          <name>encoding</name>
+          <type>java.lang.String</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered resources.</description>
+        </parameter>
+        <parameter>
+          <name>escapeString</name>
+          <type>java.lang.String</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Expressions preceded with this string won&apos;t be interpolated. Anything else preceded with this string will be passed through unchanged. For example \${foo} will be replaced with ${foo} but \\${foo} will be replaced with \\value of foo, if this parameter has been set to the backslash.</description>
+        </parameter>
+        <parameter>
+          <name>escapeWindowsPaths</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Whether to escape backslashes and colons in windows-style paths.</description>
+        </parameter>
+        <parameter>
+          <name>fileNameFiltering</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Support filtering of filenames folders etc.</description>
+        </parameter>
+        <parameter>
+          <name>filters</name>
+          <type>java.util.List</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+The list of extra filter properties files to be used along with System properties, project properties, and filter properties files specified in the POM build/filters section, which should be used for the filtering during the current mojo execution.
+
+Normally, these will be configured from a plugin&apos;s execution section, to provide a different set of filters for a particular execution. For instance, starting in Maven 2.2.0, you have the option of configuring executions with the id&apos;s default-resources and default-testResources to supply different configurations for the two different types of resources. By supplying extraFilters configurations, you can separate which filters are used for which type of resource.
+</description>
+        </parameter>
+        <parameter>
+          <name>includeEmptyDirs</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Copy any empty directories included in the Resources.</description>
+        </parameter>
+        <parameter>
+          <name>mavenFilteringHints</name>
+          <type>java.util.List</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+List of plexus components hint which implements org.apache.maven.shared.filtering.MavenResourcesFiltering.filterResources(org.apache.maven.shared.filtering.MavenResourcesExecution). They will be executed after the resources copying/filtering.
+</description>
+        </parameter>
+        <parameter>
+          <name>nonFilteredFileExtensions</name>
+          <type>java.util.List</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Additional file extensions to not apply filtering (already defined are : jpg, jpeg, gif, bmp, png)</description>
+        </parameter>
+        <parameter>
+          <name>outputDirectory</name>
+          <type>java.io.File</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The output directory into which to copy the resources.</description>
+        </parameter>
+        <parameter>
+          <name>overwrite</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <deprecated>Use changeDetection instead.</deprecated>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Overwrite existing files even if the destination files are newer.</description>
+        </parameter>
+        <parameter>
+          <name>project</name>
+          <type>org.apache.maven.project.MavenProject</type>
+          <required>true</required>
+          <editable>false</editable>
+          <description></description>
+        </parameter>
+        <parameter>
+          <name>propertiesEncoding</name>
+          <type>java.lang.String</type>
+          <since>3.2.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered properties files. If not specified, it will default to the value of the &quot;encoding&quot; parameter.</description>
+        </parameter>
+        <parameter>
+          <name>resources</name>
+          <type>java.util.List</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The list of resources we want to transfer. See the Maven Model for a description of how to code the resources element.</description>
+        </parameter>
+        <parameter>
+          <name>session</name>
+          <type>org.apache.maven.execution.MavenSession</type>
+          <required>true</required>
+          <editable>false</editable>
+          <description></description>
+        </parameter>
+        <parameter>
+          <name>skip</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>You can skip the execution of the plugin if you need to. Its use is NOT RECOMMENDED, but quite convenient on occasion.</description>
+        </parameter>
+        <parameter>
+          <name>supportMultiLineFiltering</name>
+          <type>boolean</type>
+          <since>2.5</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>stop searching endToken at the end of line</description>
+        </parameter>
+        <parameter>
+          <name>useBuildFilters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>If false, don&apos;t use the filters specified in the build/filters section of the POM when processing resources in this mojo execution.
+See also: buildFilters, filters</description>
+        </parameter>
+        <parameter>
+          <name>useDefaultDelimiters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Use default delimiters in addition to custom delimiters, if any.</description>
+        </parameter>
+      </parameters>
+      <configuration>
+        <addDefaultExcludes implementation="boolean" default-value="true"/>
+        <buildFilters implementation="java.util.List" default-value="${project.build.filters}"/>
+        <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}"/>
+        <escapeWindowsPaths implementation="boolean" default-value="true"/>
+        <fileNameFiltering implementation="boolean" default-value="false"/>
+        <includeEmptyDirs implementation="boolean" default-value="false"/>
+        <overwrite implementation="boolean" default-value="false"/>
+        <project implementation="org.apache.maven.project.MavenProject" default-value="${project}"/>
+        <session implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
+        <skip implementation="boolean" default-value="false">${maven.resources.skip}</skip>
+        <supportMultiLineFiltering implementation="boolean" default-value="false"/>
+        <useBuildFilters implementation="boolean" default-value="true"/>
+        <useDefaultDelimiters implementation="boolean" default-value="true"/>
+      </configuration>
+    </mojo>
+    <mojo>
+      <goal>help</goal>
+      <description>Display help information on maven-resources-plugin.
+Call mvn resources:help -Ddetail=true -Dgoal=&lt;goal-name&gt; to display parameter details.</description>
+      <requiresDirectInvocation>false</requiresDirectInvocation>
+      <requiresProject>false</requiresProject>
+      <requiresReports>false</requiresReports>
+      <aggregator>false</aggregator>
+      <requiresOnline>false</requiresOnline>
+      <inheritedByDefault>true</inheritedByDefault>
+      <implementation>org.apache.maven.plugins.maven_resources_plugin.HelpMojo</implementation>
+      <language>java</language>
+      <instantiationStrategy>per-lookup</instantiationStrategy>
+      <executionStrategy>once-per-session</executionStrategy>
+      <threadSafe>true</threadSafe>
+      <parameters>
+        <parameter>
+          <name>detail</name>
+          <type>boolean</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>If true, display all settable properties for each goal.</description>
+        </parameter>
+        <parameter>
+          <name>goal</name>
+          <type>java.lang.String</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The name of the goal for which to show help. If unspecified, all goals will be displayed.</description>
+        </parameter>
+        <parameter>
+          <name>indentSize</name>
+          <type>int</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The number of spaces per indentation level, should be positive.</description>
+        </parameter>
+        <parameter>
+          <name>lineLength</name>
+          <type>int</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The maximum length of a display line, should be positive.</description>
+        </parameter>
+      </parameters>
+      <configuration>
+        <detail implementation="boolean" default-value="false">${detail}</detail>
+        <goal implementation="java.lang.String">${goal}</goal>
+        <indentSize implementation="int" default-value="2">${indentSize}</indentSize>
+        <lineLength implementation="int" default-value="80">${lineLength}</lineLength>
+      </configuration>
+    </mojo>
+    <mojo>
+      <goal>resources</goal>
+      <description>Copy resources for the main source code to the main output directory. Always uses the project.build.resources element to specify the resources to copy.</description>
+      <requiresDirectInvocation>false</requiresDirectInvocation>
+      <requiresProject>true</requiresProject>
+      <requiresReports>false</requiresReports>
+      <aggregator>false</aggregator>
+      <requiresOnline>false</requiresOnline>
+      <inheritedByDefault>true</inheritedByDefault>
+      <phase>process-resources</phase>
+      <implementation>org.apache.maven.plugins.resources.ResourcesMojo</implementation>
+      <language>java</language>
+      <instantiationStrategy>per-lookup</instantiationStrategy>
+      <executionStrategy>once-per-session</executionStrategy>
+      <threadSafe>true</threadSafe>
+      <parameters>
+        <parameter>
+          <name>addDefaultExcludes</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>By default files like .gitignore, .cvsignore etc. are excluded which means they will not being copied. If you need them for a particular reason you can do that by settings this to false. This means all files like the following will be copied. 
+* Misc: **/*~, **/#*#, **/.#*, **/%*%, **/._* 
+* CVS: **/CVS, **/CVS/**, **/.cvsignore 
+* RCS: **/RCS, **/RCS/** 
+* SCCS: **/SCCS, **/SCCS/** 
+* VSSercer: **/vssver.scc 
+* MKS: **/project.pj 
+* SVN: **/.svn, **/.svn/** 
+* GNU: **/.arch-ids, **/.arch-ids/** 
+* Bazaar: **/.bzr, **/.bzr/** 
+* SurroundSCM: **/.MySCMServerInfo 
+* Mac: **/.DS_Store 
+* Serena Dimension: **/.metadata, **/.metadata/** 
+* Mercurial: **/.hg, **/.hg/** 
+* Git: **/.git, **/.git/** 
+* Bitkeeper: **/BitKeeper, **/BitKeeper/**, **/ChangeSet, **/ChangeSet/** 
+* Darcs: **/_darcs, **/_darcs/**, **/.darcsrepo, **/.darcsrepo/****/-darcs-backup*, **/.darcs-temp-mail </description>
+        </parameter>
+        <parameter>
+          <name>buildFilters</name>
+          <type>java.util.List</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>false</editable>
+          <description>The list of additional filter properties files to be used along with System and project properties, which would be used for the filtering.
+See also: filters</description>
+        </parameter>
+        <parameter>
+          <name>changeDetection</name>
+          <type>java.lang.String</type>
+          <since>3.5.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The strategy to use for change detection. Supported values are listed below. If this parameter is configured, it will override the value of overwrite. Strategies and their behavior are as follows: 
+* content: This is the default strategy since version 3.4.0. Overwrites existing target file only if content differs. 
+* timestamp: This was the default strategy before version 3.4.0. Overwrites existing target file only if target timestamp is older than source timestamp. 
+* timestamp+content: Combines the two strategies above; if timestamp is older and if content differs, existing target file will be overwritten. 
+* always: Always overwrites existing target file. Equivalent of overwrite=true. 
+* never: Never overwrites existing target file. Note: default value of this parameter is handled programmatically (as &quot;content&quot;) for programmatic detection reasons.</description>
+        </parameter>
+        <parameter>
+          <name>delimiters</name>
+          <type>java.util.LinkedHashSet</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+Set of delimiters for expressions to filter within the resources. These delimiters are specified in the form beginToken*endToken. If no * is given, the delimiter is assumed to be the same for start and end.
+
+So, the default filtering delimiters might be specified as:
+&lt;delimiters&gt; &lt;delimiter&gt;${*}&lt;/delimiter&gt; &lt;delimiter&gt;@&lt;/delimiter&gt; &lt;/delimiters&gt; 
+Since the @ delimiter is the same on both ends, we don&apos;t need to specify @*@ (though we can).
+</description>
+        </parameter>
+        <parameter>
+          <name>encoding</name>
+          <type>java.lang.String</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered resources.</description>
+        </parameter>
+        <parameter>
+          <name>escapeString</name>
+          <type>java.lang.String</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Expressions preceded with this string won&apos;t be interpolated. Anything else preceded with this string will be passed through unchanged. For example \${foo} will be replaced with ${foo} but \\${foo} will be replaced with \\value of foo, if this parameter has been set to the backslash.</description>
+        </parameter>
+        <parameter>
+          <name>escapeWindowsPaths</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Whether to escape backslashes and colons in windows-style paths.</description>
+        </parameter>
+        <parameter>
+          <name>fileNameFiltering</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Support filtering of filenames folders etc.</description>
+        </parameter>
+        <parameter>
+          <name>filters</name>
+          <type>java.util.List</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+The list of extra filter properties files to be used along with System properties, project properties, and filter properties files specified in the POM build/filters section, which should be used for the filtering during the current mojo execution.
+
+Normally, these will be configured from a plugin&apos;s execution section, to provide a different set of filters for a particular execution. For instance, starting in Maven 2.2.0, you have the option of configuring executions with the id&apos;s default-resources and default-testResources to supply different configurations for the two different types of resources. By supplying extraFilters configurations, you can separate which filters are used for which type of resource.
+</description>
+        </parameter>
+        <parameter>
+          <name>includeEmptyDirs</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Copy any empty directories included in the Resources.</description>
+        </parameter>
+        <parameter>
+          <name>mavenFilteringHints</name>
+          <type>java.util.List</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+List of plexus components hint which implements org.apache.maven.shared.filtering.MavenResourcesFiltering.filterResources(org.apache.maven.shared.filtering.MavenResourcesExecution). They will be executed after the resources copying/filtering.
+</description>
+        </parameter>
+        <parameter>
+          <name>nonFilteredFileExtensions</name>
+          <type>java.util.List</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Additional file extensions to not apply filtering (already defined are : jpg, jpeg, gif, bmp, png)</description>
+        </parameter>
+        <parameter>
+          <name>outputDirectory</name>
+          <type>java.io.File</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The output directory into which to copy the resources.</description>
+        </parameter>
+        <parameter>
+          <name>overwrite</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <deprecated>Use changeDetection instead.</deprecated>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Overwrite existing files even if the destination files are newer.</description>
+        </parameter>
+        <parameter>
+          <name>project</name>
+          <type>org.apache.maven.project.MavenProject</type>
+          <required>true</required>
+          <editable>false</editable>
+          <description></description>
+        </parameter>
+        <parameter>
+          <name>propertiesEncoding</name>
+          <type>java.lang.String</type>
+          <since>3.2.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered properties files. If not specified, it will default to the value of the &quot;encoding&quot; parameter.</description>
+        </parameter>
+        <parameter>
+          <name>resources</name>
+          <type>java.util.List</type>
+          <required>true</required>
+          <editable>false</editable>
+          <description>The list of resources we want to transfer.</description>
+        </parameter>
+        <parameter>
+          <name>session</name>
+          <type>org.apache.maven.execution.MavenSession</type>
+          <required>true</required>
+          <editable>false</editable>
+          <description></description>
+        </parameter>
+        <parameter>
+          <name>skip</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>You can skip the execution of the plugin if you need to. Its use is NOT RECOMMENDED, but quite convenient on occasion.</description>
+        </parameter>
+        <parameter>
+          <name>supportMultiLineFiltering</name>
+          <type>boolean</type>
+          <since>2.5</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>stop searching endToken at the end of line</description>
+        </parameter>
+        <parameter>
+          <name>useBuildFilters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>If false, don&apos;t use the filters specified in the build/filters section of the POM when processing resources in this mojo execution.
+See also: buildFilters, filters</description>
+        </parameter>
+        <parameter>
+          <name>useDefaultDelimiters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Use default delimiters in addition to custom delimiters, if any.</description>
+        </parameter>
+      </parameters>
+      <configuration>
+        <addDefaultExcludes implementation="boolean" default-value="true"/>
+        <buildFilters implementation="java.util.List" default-value="${project.build.filters}"/>
+        <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}"/>
+        <escapeWindowsPaths implementation="boolean" default-value="true"/>
+        <fileNameFiltering implementation="boolean" default-value="false"/>
+        <includeEmptyDirs implementation="boolean" default-value="false"/>
+        <outputDirectory implementation="java.io.File" default-value="${project.build.outputDirectory}"/>
+        <overwrite implementation="boolean" default-value="false"/>
+        <project implementation="org.apache.maven.project.MavenProject" default-value="${project}"/>
+        <resources implementation="java.util.List" default-value="${project.resources}"/>
+        <session implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
+        <skip implementation="boolean" default-value="false">${maven.resources.skip}</skip>
+        <supportMultiLineFiltering implementation="boolean" default-value="false"/>
+        <useBuildFilters implementation="boolean" default-value="true"/>
+        <useDefaultDelimiters implementation="boolean" default-value="true"/>
+      </configuration>
+    </mojo>
+    <mojo>
+      <goal>testResources</goal>
+      <description>Copy resources for the test source code to the test output directory. Always uses the project.build.testResources element to specify the resources to copy.</description>
+      <requiresDirectInvocation>false</requiresDirectInvocation>
+      <requiresProject>true</requiresProject>
+      <requiresReports>false</requiresReports>
+      <aggregator>false</aggregator>
+      <requiresOnline>false</requiresOnline>
+      <inheritedByDefault>true</inheritedByDefault>
+      <phase>process-test-resources</phase>
+      <implementation>org.apache.maven.plugins.resources.TestResourcesMojo</implementation>
+      <language>java</language>
+      <instantiationStrategy>per-lookup</instantiationStrategy>
+      <executionStrategy>once-per-session</executionStrategy>
+      <threadSafe>true</threadSafe>
+      <parameters>
+        <parameter>
+          <name>addDefaultExcludes</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>By default files like .gitignore, .cvsignore etc. are excluded which means they will not being copied. If you need them for a particular reason you can do that by settings this to false. This means all files like the following will be copied. 
+* Misc: **/*~, **/#*#, **/.#*, **/%*%, **/._* 
+* CVS: **/CVS, **/CVS/**, **/.cvsignore 
+* RCS: **/RCS, **/RCS/** 
+* SCCS: **/SCCS, **/SCCS/** 
+* VSSercer: **/vssver.scc 
+* MKS: **/project.pj 
+* SVN: **/.svn, **/.svn/** 
+* GNU: **/.arch-ids, **/.arch-ids/** 
+* Bazaar: **/.bzr, **/.bzr/** 
+* SurroundSCM: **/.MySCMServerInfo 
+* Mac: **/.DS_Store 
+* Serena Dimension: **/.metadata, **/.metadata/** 
+* Mercurial: **/.hg, **/.hg/** 
+* Git: **/.git, **/.git/** 
+* Bitkeeper: **/BitKeeper, **/BitKeeper/**, **/ChangeSet, **/ChangeSet/** 
+* Darcs: **/_darcs, **/_darcs/**, **/.darcsrepo, **/.darcsrepo/****/-darcs-backup*, **/.darcs-temp-mail </description>
+        </parameter>
+        <parameter>
+          <name>buildFilters</name>
+          <type>java.util.List</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>false</editable>
+          <description>The list of additional filter properties files to be used along with System and project properties, which would be used for the filtering.
+See also: filters</description>
+        </parameter>
+        <parameter>
+          <name>changeDetection</name>
+          <type>java.lang.String</type>
+          <since>3.5.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The strategy to use for change detection. Supported values are listed below. If this parameter is configured, it will override the value of overwrite. Strategies and their behavior are as follows: 
+* content: This is the default strategy since version 3.4.0. Overwrites existing target file only if content differs. 
+* timestamp: This was the default strategy before version 3.4.0. Overwrites existing target file only if target timestamp is older than source timestamp. 
+* timestamp+content: Combines the two strategies above; if timestamp is older and if content differs, existing target file will be overwritten. 
+* always: Always overwrites existing target file. Equivalent of overwrite=true. 
+* never: Never overwrites existing target file. Note: default value of this parameter is handled programmatically (as &quot;content&quot;) for programmatic detection reasons.</description>
+        </parameter>
+        <parameter>
+          <name>delimiters</name>
+          <type>java.util.LinkedHashSet</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+Set of delimiters for expressions to filter within the resources. These delimiters are specified in the form beginToken*endToken. If no * is given, the delimiter is assumed to be the same for start and end.
+
+So, the default filtering delimiters might be specified as:
+&lt;delimiters&gt; &lt;delimiter&gt;${*}&lt;/delimiter&gt; &lt;delimiter&gt;@&lt;/delimiter&gt; &lt;/delimiters&gt; 
+Since the @ delimiter is the same on both ends, we don&apos;t need to specify @*@ (though we can).
+</description>
+        </parameter>
+        <parameter>
+          <name>encoding</name>
+          <type>java.lang.String</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered resources.</description>
+        </parameter>
+        <parameter>
+          <name>escapeString</name>
+          <type>java.lang.String</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Expressions preceded with this string won&apos;t be interpolated. Anything else preceded with this string will be passed through unchanged. For example \${foo} will be replaced with ${foo} but \\${foo} will be replaced with \\value of foo, if this parameter has been set to the backslash.</description>
+        </parameter>
+        <parameter>
+          <name>escapeWindowsPaths</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Whether to escape backslashes and colons in windows-style paths.</description>
+        </parameter>
+        <parameter>
+          <name>fileNameFiltering</name>
+          <type>boolean</type>
+          <since>3.0.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Support filtering of filenames folders etc.</description>
+        </parameter>
+        <parameter>
+          <name>filters</name>
+          <type>java.util.List</type>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+The list of extra filter properties files to be used along with System properties, project properties, and filter properties files specified in the POM build/filters section, which should be used for the filtering during the current mojo execution.
+
+Normally, these will be configured from a plugin&apos;s execution section, to provide a different set of filters for a particular execution. For instance, starting in Maven 2.2.0, you have the option of configuring executions with the id&apos;s default-resources and default-testResources to supply different configurations for the two different types of resources. By supplying extraFilters configurations, you can separate which filters are used for which type of resource.
+</description>
+        </parameter>
+        <parameter>
+          <name>includeEmptyDirs</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Copy any empty directories included in the Resources.</description>
+        </parameter>
+        <parameter>
+          <name>mavenFilteringHints</name>
+          <type>java.util.List</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>
+List of plexus components hint which implements org.apache.maven.shared.filtering.MavenResourcesFiltering.filterResources(org.apache.maven.shared.filtering.MavenResourcesExecution). They will be executed after the resources copying/filtering.
+</description>
+        </parameter>
+        <parameter>
+          <name>nonFilteredFileExtensions</name>
+          <type>java.util.List</type>
+          <since>2.3</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Additional file extensions to not apply filtering (already defined are : jpg, jpeg, gif, bmp, png)</description>
+        </parameter>
+        <parameter>
+          <name>outputDirectory</name>
+          <type>java.io.File</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The output directory into which to copy the resources.</description>
+        </parameter>
+        <parameter>
+          <name>overwrite</name>
+          <type>boolean</type>
+          <since>2.3</since>
+          <deprecated>Use changeDetection instead.</deprecated>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Overwrite existing files even if the destination files are newer.</description>
+        </parameter>
+        <parameter>
+          <name>project</name>
+          <type>org.apache.maven.project.MavenProject</type>
+          <required>true</required>
+          <editable>false</editable>
+          <description></description>
+        </parameter>
+        <parameter>
+          <name>propertiesEncoding</name>
+          <type>java.lang.String</type>
+          <since>3.2.0</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>The character encoding to use when reading and writing filtered properties files. If not specified, it will default to the value of the &quot;encoding&quot; parameter.</description>
+        </parameter>
+        <parameter>
+          <name>resources</name>
+          <type>java.util.List</type>
+          <required>true</required>
+          <editable>true</editable>
+          <description>The list of resources we want to transfer.</description>
+        </parameter>
+        <parameter>
+          <name>session</name>
+          <type>org.apache.maven.execution.MavenSession</type>
+          <required>true</required>
+          <editable>false</editable>
+          <description></description>
+        </parameter>
+        <parameter>
+          <name>skip</name>
+          <type>boolean</type>
+          <since>2.6</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Set this to &apos;true&apos; to bypass copying of test resources. Its use is NOT RECOMMENDED, but quite convenient on occasion.</description>
+        </parameter>
+        <parameter>
+          <name>supportMultiLineFiltering</name>
+          <type>boolean</type>
+          <since>2.5</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>stop searching endToken at the end of line</description>
+        </parameter>
+        <parameter>
+          <name>useBuildFilters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>If false, don&apos;t use the filters specified in the build/filters section of the POM when processing resources in this mojo execution.
+See also: buildFilters, filters</description>
+        </parameter>
+        <parameter>
+          <name>useDefaultDelimiters</name>
+          <type>boolean</type>
+          <since>2.4</since>
+          <required>false</required>
+          <editable>true</editable>
+          <description>Use default delimiters in addition to custom delimiters, if any.</description>
+        </parameter>
+      </parameters>
+      <configuration>
+        <addDefaultExcludes implementation="boolean" default-value="true"/>
+        <buildFilters implementation="java.util.List" default-value="${project.build.filters}"/>
+        <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}"/>
+        <escapeWindowsPaths implementation="boolean" default-value="true"/>
+        <fileNameFiltering implementation="boolean" default-value="false"/>
+        <includeEmptyDirs implementation="boolean" default-value="false"/>
+        <outputDirectory implementation="java.io.File" default-value="${project.build.testOutputDirectory}"/>
+        <overwrite implementation="boolean" default-value="false"/>
+        <project implementation="org.apache.maven.project.MavenProject" default-value="${project}"/>
+        <resources implementation="java.util.List" default-value="${project.testResources}"/>
+        <session implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
+        <skip implementation="boolean" default-value="false">${maven.test.skip}</skip>
+        <supportMultiLineFiltering implementation="boolean" default-value="false"/>
+        <useBuildFilters implementation="boolean" default-value="true"/>
+        <useDefaultDelimiters implementation="boolean" default-value="true"/>
+      </configuration>
+    </mojo>
+  </mojos>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-filtering</artifactId>
+      <type>jar</type>
+      <version>3.5.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-interpolation</artifactId>
+      <type>jar</type>
+      <version>1.29</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-build-api</artifactId>
+      <type>jar</type>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.sonatype.plexus</groupId>
+      <artifactId>plexus-build-api</artifactId>
+      <type>jar</type>
+      <version>0.0.7</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+      <type>jar</type>
+      <version>3.6.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.sisu</groupId>
+      <artifactId>org.eclipse.sisu.plexus</artifactId>
+      <type>jar</type>
+      <version>0.9.0.M4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-classworlds</artifactId>
+      <type>jar</type>
+      <version>2.9.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-component-annotations</artifactId>
+      <type>jar</type>
+      <version>2.2.0</version>
+    </dependency>
+  </dependencies>
+</plugin>
--- /dev/null
+++ b/src/main/org/apache/maven/plugins/maven_resources_plugin/HelpMojo.java
@@ -0,0 +1,448 @@
+package org.apache.maven.plugins.maven_resources_plugin;
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Display help information on maven-resources-plugin.<br>
+ * Call <code>mvn resources:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</code> to display parameter details.
+ * @author maven-plugin-tools
+ */
+@Mojo( name = "help", requiresProject = false, threadSafe = true )
+public class HelpMojo
+    extends AbstractMojo
+{
+    /**
+     * If <code>true</code>, display all settable properties for each goal.
+     *
+     */
+    @Parameter( property = "detail", defaultValue = "false" )
+    private boolean detail;
+
+    /**
+     * The name of the goal for which to show help. If unspecified, all goals will be displayed.
+     *
+     */
+    @Parameter( property = "goal" )
+    private java.lang.String goal;
+
+    /**
+     * The maximum length of a display line, should be positive.
+     *
+     */
+    @Parameter( property = "lineLength", defaultValue = "80" )
+    private int lineLength;
+
+    /**
+     * The number of spaces per indentation level, should be positive.
+     *
+     */
+    @Parameter( property = "indentSize", defaultValue = "2" )
+    private int indentSize;
+
+    // /META-INF/maven/<groupId>/<artifactId>/plugin-help.xml
+    private static final String PLUGIN_HELP_PATH =
+                    "/META-INF/maven/org.apache.maven.plugins/maven-resources-plugin/plugin-help.xml";
+
+    private static final int DEFAULT_LINE_LENGTH = 80;
+
+    private Document build()
+        throws MojoExecutionException
+    {
+        getLog().debug( "load plugin-help.xml: " + PLUGIN_HELP_PATH );
+        try ( InputStream is = getClass().getResourceAsStream( PLUGIN_HELP_PATH ) )
+        {
+            if ( is == null )
+            {
+                throw new MojoExecutionException( "Could not find plugin descriptor at " + PLUGIN_HELP_PATH );
+            }
+            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+            return dBuilder.parse( is );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoExecutionException( e.getMessage(), e );
+        }
+        catch ( ParserConfigurationException e )
+        {
+            throw new MojoExecutionException( e.getMessage(), e );
+        }
+        catch ( SAXException e )
+        {
+            throw new MojoExecutionException( e.getMessage(), e );
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void execute()
+        throws MojoExecutionException
+    {
+        if ( lineLength <= 0 )
+        {
+            getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." );
+            lineLength = DEFAULT_LINE_LENGTH;
+        }
+        if ( indentSize <= 0 )
+        {
+            getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." );
+            indentSize = 2;
+        }
+
+        Document doc = build();
+
+        StringBuilder sb = new StringBuilder();
+        Node plugin = getSingleChild( doc, "plugin" );
+
+
+        String name = getValue( plugin, "name" );
+        String version = getValue( plugin, "version" );
+        String id = getValue( plugin, "groupId" ) + ":" + getValue( plugin, "artifactId" ) + ":" + version;
+        if ( isNotEmpty( name ) && !name.contains( id ) )
+        {
+            append( sb, name + " " + version, 0 );
+        }
+        else
+        {
+            if ( isNotEmpty( name ) )
+            {
+                append( sb, name, 0 );
+            }
+            else
+            {
+                append( sb, id, 0 );
+            }
+        }
+        append( sb, getValue( plugin, "description" ), 1 );
+        append( sb, "", 0 );
+
+        //<goalPrefix>plugin</goalPrefix>
+        String goalPrefix = getValue( plugin, "goalPrefix" );
+
+        Node mojos1 = getSingleChild( plugin, "mojos" );
+
+        List<Node> mojos = findNamedChild( mojos1, "mojo" );
+
+        if ( goal == null || goal.length() <= 0 )
+        {
+            append( sb, "This plugin has " + mojos.size() + ( mojos.size() > 1 ? " goals:" : " goal:" ), 0 );
+            append( sb, "", 0 );
+        }
+
+        for ( Node mojo : mojos )
+        {
+            writeGoal( sb, goalPrefix, (Element) mojo );
+        }
+
+        if ( getLog().isInfoEnabled() )
+        {
+            getLog().info( sb.toString() );
+        }
+    }
+
+
+    private static boolean isNotEmpty( String string )
+    {
+        return string != null && string.length() > 0;
+    }
+
+    private static String getValue( Node node, String elementName )
+        throws MojoExecutionException
+    {
+        return getSingleChild( node, elementName ).getTextContent();
+    }
+
+    private static Node getSingleChild( Node node, String elementName )
+        throws MojoExecutionException
+    {
+        List<Node> namedChild = findNamedChild( node, elementName );
+        if ( namedChild.isEmpty() )
+        {
+            throw new MojoExecutionException( "Could not find " + elementName + " in plugin-help.xml" );
+        }
+        if ( namedChild.size() > 1 )
+        {
+            throw new MojoExecutionException( "Multiple " + elementName + " in plugin-help.xml" );
+        }
+        return namedChild.get( 0 );
+    }
+
+    private static List<Node> findNamedChild( Node node, String elementName )
+    {
+        List<Node> result = new ArrayList<Node>();
+        NodeList childNodes = node.getChildNodes();
+        for ( int i = 0; i < childNodes.getLength(); i++ )
+        {
+            Node item = childNodes.item( i );
+            if ( elementName.equals( item.getNodeName() ) )
+            {
+                result.add( item );
+            }
+        }
+        return result;
+    }
+
+    private static Node findSingleChild( Node node, String elementName )
+        throws MojoExecutionException
+    {
+        List<Node> elementsByTagName = findNamedChild( node, elementName );
+        if ( elementsByTagName.isEmpty() )
+        {
+            return null;
+        }
+        if ( elementsByTagName.size() > 1 )
+        {
+            throw new MojoExecutionException( "Multiple " + elementName + "in plugin-help.xml" );
+        }
+        return elementsByTagName.get( 0 );
+    }
+
+    private void writeGoal( StringBuilder sb, String goalPrefix, Element mojo )
+        throws MojoExecutionException
+    {
+        String mojoGoal = getValue( mojo, "goal" );
+        Node configurationElement = findSingleChild( mojo, "configuration" );
+        Node description = findSingleChild( mojo, "description" );
+        if ( goal == null || goal.length() <= 0 || mojoGoal.equals( goal ) )
+        {
+            append( sb, goalPrefix + ":" + mojoGoal, 0 );
+            Node deprecated = findSingleChild( mojo, "deprecated" );
+            if ( ( deprecated != null ) && isNotEmpty( deprecated.getTextContent() ) )
+            {
+                append( sb, "Deprecated. " + deprecated.getTextContent(), 1 );
+                if ( detail && description != null )
+                {
+                    append( sb, "", 0 );
+                    append( sb, description.getTextContent(), 1 );
+                }
+            }
+            else if ( description != null )
+            {
+                append( sb, description.getTextContent(), 1 );
+            }
+            append( sb, "", 0 );
+
+            if ( detail )
+            {
+                Node parametersNode = getSingleChild( mojo, "parameters" );
+                List<Node> parameters = findNamedChild( parametersNode, "parameter" );
+                append( sb, "Available parameters:", 1 );
+                append( sb, "", 0 );
+
+                for ( Node parameter : parameters )
+                {
+                    writeParameter( sb, parameter, configurationElement );
+                }
+            }
+        }
+    }
+
+    private void writeParameter( StringBuilder sb, Node parameter, Node configurationElement )
+        throws MojoExecutionException
+    {
+        String parameterName = getValue( parameter, "name" );
+        String parameterDescription = getValue( parameter, "description" );
+
+        Element fieldConfigurationElement = null;
+        if ( configurationElement != null )
+        {
+          fieldConfigurationElement =  (Element) findSingleChild( configurationElement, parameterName );
+        }
+
+        String parameterDefaultValue = "";
+        if ( fieldConfigurationElement != null && fieldConfigurationElement.hasAttribute( "default-value" ) )
+        {
+            parameterDefaultValue = " (Default: " + fieldConfigurationElement.getAttribute( "default-value" ) + ")";
+        }
+        append( sb, parameterName + parameterDefaultValue, 2 );
+        Node deprecated = findSingleChild( parameter, "deprecated" );
+        if ( ( deprecated != null ) && isNotEmpty( deprecated.getTextContent() ) )
+        {
+            append( sb, "Deprecated. " + deprecated.getTextContent(), 3 );
+            append( sb, "", 0 );
+        }
+        if ( isNotEmpty( parameterDescription ) ) {
+            append( sb, parameterDescription, 3 );
+        }
+        if ( "true".equals( getValue( parameter, "required" ) ) )
+        {
+            append( sb, "Required: Yes", 3 );
+        }
+        if ( ( fieldConfigurationElement != null ) && isNotEmpty( fieldConfigurationElement.getTextContent() ) )
+        {
+            String property = getPropertyFromExpression( fieldConfigurationElement.getTextContent() );
+            append( sb, "User property: " + property, 3 );
+        }
+
+        append( sb, "", 0 );
+    }
+
+    /**
+     * <p>Repeat a String <code>n</code> times to form a new string.</p>
+     *
+     * @param str    String to repeat
+     * @param repeat number of times to repeat str
+     * @return String with repeated String
+     * @throws NegativeArraySizeException if <code>repeat &lt; 0</code>
+     * @throws NullPointerException       if str is <code>null</code>
+     */
+    private static String repeat( String str, int repeat )
+    {
+        StringBuilder buffer = new StringBuilder( repeat * str.length() );
+
+        for ( int i = 0; i < repeat; i++ )
+        {
+            buffer.append( str );
+        }
+
+        return buffer.toString();
+    }
+
+    /**
+     * Append a description to the buffer by respecting the indentSize and lineLength parameters.
+     * <b>Note</b>: The last character is always a new line.
+     *
+     * @param sb          The buffer to append the description, not <code>null</code>.
+     * @param description The description, not <code>null</code>.
+     * @param indent      The base indentation level of each line, must not be negative.
+     */
+    private void append( StringBuilder sb, String description, int indent )
+    {
+        for ( String line : toLines( description, indent, indentSize, lineLength ) )
+        {
+            sb.append( line ).append( '\n' );
+        }
+    }
+
+    /**
+     * Splits the specified text into lines of convenient display length.
+     *
+     * @param text       The text to split into lines, must not be <code>null</code>.
+     * @param indent     The base indentation level of each line, must not be negative.
+     * @param indentSize The size of each indentation, must not be negative.
+     * @param lineLength The length of the line, must not be negative.
+     * @return The sequence of display lines, never <code>null</code>.
+     * @throws NegativeArraySizeException if <code>indent &lt; 0</code>
+     */
+    private static List<String> toLines( String text, int indent, int indentSize, int lineLength )
+    {
+        List<String> lines = new ArrayList<String>();
+
+        String ind = repeat( "\t", indent );
+
+        String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
+
+        for ( String plainLine : plainLines )
+        {
+            toLines( lines, ind + plainLine, indentSize, lineLength );
+        }
+
+        return lines;
+    }
+
+    /**
+     * Adds the specified line to the output sequence, performing line wrapping if necessary.
+     *
+     * @param lines      The sequence of display lines, must not be <code>null</code>.
+     * @param line       The line to add, must not be <code>null</code>.
+     * @param indentSize The size of each indentation, must not be negative.
+     * @param lineLength The length of the line, must not be negative.
+     */
+    private static void toLines( List<String> lines, String line, int indentSize, int lineLength )
+    {
+        int lineIndent = getIndentLevel( line );
+        StringBuilder buf = new StringBuilder( 256 );
+
+        String[] tokens = line.split( " +" );
+
+        for ( String token : tokens )
+        {
+            if ( buf.length() > 0 )
+            {
+                if ( buf.length() + token.length() >= lineLength )
+                {
+                    lines.add( buf.toString() );
+                    buf.setLength( 0 );
+                    buf.append( repeat( " ", lineIndent * indentSize ) );
+                }
+                else
+                {
+                    buf.append( ' ' );
+                }
+            }
+
+            for ( int j = 0; j < token.length(); j++ )
+            {
+                char c = token.charAt( j );
+                if ( c == '\t' )
+                {
+                    buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
+                }
+                else if ( c == '\u00A0' )
+                {
+                    buf.append( ' ' );
+                }
+                else
+                {
+                    buf.append( c );
+                }
+            }
+        }
+        lines.add( buf.toString() );
+    }
+
+    /**
+     * Gets the indentation level of the specified line.
+     *
+     * @param line The line whose indentation level should be retrieved, must not be <code>null</code>.
+     * @return The indentation level of the line.
+     */
+    private static int getIndentLevel( String line )
+    {
+        int level = 0;
+        for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
+        {
+            level++;
+        }
+        for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
+        {
+            if ( line.charAt( i ) == '\t' )
+            {
+                level++;
+                break;
+            }
+        }
+        return level;
+    }
+
+    private static String getPropertyFromExpression( String expression )
+    {
+        if ( expression != null && expression.startsWith( "${" ) && expression.endsWith( "}" )
+            && !expression.substring( 2 ).contains( "${" ) )
+        {
+            // expression="${xxx}" -> property="xxx"
+            return expression.substring( 2, expression.length() - 1 );
+        }
+        // no property can be extracted
+        return null;
+    }
+}
