File maven-resources-plugin-bootstrap-resources.patch of Package maven-resources-plugin
diff -urEbwBN a/src/main/filtered-resources/META-INF/maven/org.apache.maven.plugins/maven-resources-plugin/plugin-help.xml b/src/main/filtered-resources/META-INF/maven/org.apache.maven.plugins/maven-resources-plugin/plugin-help.xml
--- a/src/main/filtered-resources/META-INF/maven/org.apache.maven.plugins/maven-resources-plugin/plugin-help.xml 1970-01-01 01:00:00.000000000 +0100
+++ b/src/main/filtered-resources/META-INF/maven/org.apache.maven.plugins/maven-resources-plugin/plugin-help.xml 2025-11-23 14:50:59.691665646 +0100
@@ -0,0 +1,659 @@
+<?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>delimiters</name>
+ <type>java.util.LinkedHashSet<java.lang.String></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:
+<delimiters> <delimiter>${*}</delimiter> <delimiter>@</delimiter> </delimiters>
+Since the @ delimiter is the same on both ends, we don'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'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<java.lang.String></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'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'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<java.lang.String></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<java.lang.String></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>
+ <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 "encoding" parameter.</description>
+ </parameter>
+ <parameter>
+ <name>resources</name>
+ <type>java.util.List<org.apache.maven.model.Resource></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'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=<goal-name> 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>delimiters</name>
+ <type>java.util.LinkedHashSet<java.lang.String></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:
+<delimiters> <delimiter>${*}</delimiter> <delimiter>@</delimiter> </delimiters>
+Since the @ delimiter is the same on both ends, we don'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'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<java.lang.String></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'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'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<java.lang.String></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<java.lang.String></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>
+ <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 "encoding" 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'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>delimiters</name>
+ <type>java.util.LinkedHashSet<java.lang.String></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:
+<delimiters> <delimiter>${*}</delimiter> <delimiter>@</delimiter> </delimiters>
+Since the @ delimiter is the same on both ends, we don'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'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<java.lang.String></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'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'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<java.lang.String></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<java.lang.String></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>
+ <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 "encoding" parameter.</description>
+ </parameter>
+ <parameter>
+ <name>resources</name>
+ <type>java.util.List<org.apache.maven.model.Resource></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 'true' 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'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>
diff -urEbwBN a/src/main/filtered-resources/META-INF/maven/plugin.xml b/src/main/filtered-resources/META-INF/maven/plugin.xml
--- a/src/main/filtered-resources/META-INF/maven/plugin.xml 1970-01-01 01:00:00.000000000 +0100
+++ b/src/main/filtered-resources/META-INF/maven/plugin.xml 2025-11-23 14:49:03.913983164 +0100
@@ -0,0 +1,799 @@
+<?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>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:
+<delimiters> <delimiter>${*}</delimiter> <delimiter>@</delimiter> </delimiters>
+Since the @ delimiter is the same on both ends, we don'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'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'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'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>
+ <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 "encoding" 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'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=<goal-name> 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>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:
+<delimiters> <delimiter>${*}</delimiter> <delimiter>@</delimiter> </delimiters>
+Since the @ delimiter is the same on both ends, we don'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'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'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'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>
+ <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 "encoding" 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'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>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:
+<delimiters> <delimiter>${*}</delimiter> <delimiter>@</delimiter> </delimiters>
+Since the @ delimiter is the same on both ends, we don'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'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'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'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>
+ <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 "encoding" 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 'true' 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'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.codehaus.plexus</groupId>
+ <artifactId>plexus-utils</artifactId>
+ <type>jar</type>
+ <version>4.0.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <type>jar</type>
+ <version>1.7.36</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-interpolation</artifactId>
+ <type>jar</type>
+ <version>1.28</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.shared</groupId>
+ <artifactId>maven-filtering</artifactId>
+ <type>jar</type>
+ <version>3.4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <type>jar</type>
+ <version>2.16.1</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.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <type>jar</type>
+ <version>3.20.0</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.inject</groupId>
+ <artifactId>javax.inject</artifactId>
+ <type>jar</type>
+ <version>1</version>
+ </dependency>
+ </dependencies>
+</plugin>
diff -urEbwBN a/src/main/org/apache/maven/plugins/maven_resources_plugin/HelpMojo.java b/src/main/org/apache/maven/plugins/maven_resources_plugin/HelpMojo.java
--- a/src/main/org/apache/maven/plugins/maven_resources_plugin/HelpMojo.java 1970-01-01 01:00:00.000000000 +0100
+++ b/src/main/org/apache/maven/plugins/maven_resources_plugin/HelpMojo.java 2025-11-23 14:53:49.463603931 +0100
@@ -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=<goal-name></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 < 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 < 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;
+ }
+}