Peter Bugla created MNG-7610:
--------------------------------
Summary: ValidatingConfigurationListener doesn't validate, causing
wrong "parameters ... are missing or invalid" errors
Key: MNG-7610
URL: https://issues.apache.org/jira/browse/MNG-7610
Project: Maven
Issue Type: Bug
Components: Core
Affects Versions: 3.8.6
Environment: mvn -version
Apache Maven 3.8.6
java -version
openjdk version "11" 2018-09-25
Reporter: Peter Bugla
Applies to mvn 3.8.6 (and at least some earlier versions, but our project uses
3.8.6 now), mvn-core.
{*}Short description{*}:
ValidatingConfigurationListener (see constructor) considers all parameters
marked as required in a plugin as missing, causing an otherwise perfectly fine
mvn run to wrongly end with an error statement
Detailed description:
*Short intro* / history / pointing out that it's not my rare irrelevant
personal issue:
There are already some articles on StackOverflow getting the following error
message after an mvn run that uses a plugin, which has at least one required
parameter.
Apart from obvious user errors, where someone just forgot to set a required
parameter, looking closely there are also a bunch of cases (including mine)
where the required parameter(s) are set perfectly fine, the triggered plugin
execution used them successfully, so they were obviously there, but mvn still
ends with the error statement.:
[ERROR] Failed to execute goal
<plugin_groupId>:<plugin_artifactId>:<plugin_version>:<goal> (default-cli) on
project <your_mvn_project_name>: The parameters
'<name_of_parameter_marked_as_required_in_plugin.xml>' for goal
<plugin_groupId>:<plugin_artifactId>:<plugin_version>:<goal> are missing or
invalid
--
*Specific example* (the one I encountered):
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.1.0:java
(default-cli) on project qat.lup.alltests: The parameters 'mainClass' for goal
org.codehaus.mojo:exec-maven-plugin:3.1.0:java are missing or invalid
Excerpt from my pom.xml:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>MyExecutionId</id>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>full.package.ClassName</mainClass>
<arguments>
<argument>argument_1_for_class_ClassName</argument>
<argument>argument_2_for_class_ClassName</argument>
<argument>argument_3_for_class_ClassName</argument>
</arguments>
</configuration>
</plugin>
Started with:
mvn -s settings.xml exec:java
Run result:
The execution of full.package.ClassName via the plugin worked perfectly. So
obviously "mainClass" was found and read correctly by exec-maven-plugin,
otherwise it would have failed.
However that mvn run always ends with the error message:
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.1.0:java
(default-cli) on project qat.lup.alltests: The parameters 'mainClass' for goal
org.codehaus.mojo:exec-maven-plugin:3.1.0:java are missing or invalid
--
*My analysis* (all file names and line numbers are references against mvn 3.8.6
checked out with the according tag from your git):
As there was no answer in StackOverflow that worked for me, I dug deeper in my
case:
The relevant configuration in plugin.xml of
org.codehaus.mojo:exec-maven-plugin:3.1.0 concerning the parameter mainClass
seems fine (it's set as required as expected, no visible issue with that).
So I checked where that error message originates from and backtrack from there:
- The error message is from
PluginParameterException.java:45
(org.apache.maven.plugin.PluginParameterException) (in constructor).
- this (in the relevant case) is called from DefaultMavenPluginManager.java (in
multiple places, but I believe the relevant one here is:
DefaultMavenPluginManager.java:644
(org.apache.maven.plugin.internal.DefaultMavenPluginManager) (in
populatePluginFields)
- DefaultMavenPluginManager.java:630 calls
ValidatingConfigurationListener.java:46 (constructor) and I think in there is
the issue:
It gets the parameters from the mojoDescriptor, checks if they are marked as
required and if yes adds them to "missingParameters" without
checking if the parameters are actually present in the parameters supplied to
the "mojo".
DefaultMavenPluginManager.java:639 then gets "missingParameters" from
ValidatingConfigurationListener and turns that into a
PluginParameterException in DefaultMavenPluginManager.java:644 (depending on
if configuratorId is basic, otherwise it handles it differently in else).
{*}My conclusion{*}:
So I think the constructor of ValidatingConfigurationListener just needs to
check, if the parameters marked as required are actually present
according to its task, which includes according to JavaDoc "[...] check for
required but missing parameters." and put only those actually missing in
"missingParameters".
I assume that should solve the issue.
(When fixing it, make sure to additionally check, whether the purpose of the
if/else depending on configuratorId in DefaultMavenPluginManager.java:642-653
makes sense in this context, as it seems to call a different validation in the
else part.)
--
This message was sent by Atlassian Jira
(v8.20.10#820010)