[MCOMPILER-572] Multi-line <arg> does not work on Windows when forked
Mikkel Kjeldsen opened MCOMPILER-572 and commented
Versions of maven-compiler-plugin that rely on plexus-compiler-2.14.2, hereunder maven-compiler-plugin-3.12.1, cannot pass multi-line compiler arguments to a forked javac on Windows in any way. Further, attempting to do so produces a non-obvious and difficult to troubleshoot error. This error does not manifest outside of Windows, nor does it manifest on Windows if the compiler is not forked.
This bug is a downstream version of https://github.com/codehaus-plexus/plexus-compiler/issues/351, filed in response to https://github.com/google/error-prone/issues/4256.
The sample POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>example.multi-line-fork-crash</groupId>
<artifactId>minimally-reproducible</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.release>21</maven.compiler.release>
<maven-compiler-plugin.version>3.12.1</maven-compiler-plugin.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<fork>true</fork>
<compilerArgs>
<arg>
-Xplugin:ErrorProne \
-Xep:DeadException:WARN</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
should fail to compile with the error
plug-in not found: ErrorProne
but instead fails with the error
error: invalid flag: -Xep:DeadException
because plexus-compiler indiscriminately translates the \ to / and breaks javac 's multi-line argument support.
Affects: 3.12.1
Issue Links:
- MCOMPILER-425 Compiler argument with newline treated as multiple arguments in fork mode
Remote Links:
Michael Osipov commented
You are misusing this parameter: https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#compilerArgs This is not an arg line.
Mikkel Kjeldsen commented
Michael Osipov, "arg line" is not a term defined by the documentation you reference, and -Xplugin:ErrorProne -Xep:DeadException:WARN is a single argument, not two arguments. Please advise.
Let me reiterate that this is just a tracking issue. There is nothing for maven-compiler-plugin to fix except upgrading plexus-compiler to a version that fixes the discrepant behaviour -- hopefully in a way that allows the missing functionality -- once such a version exists.
Michael Osipov commented
Let me rephrase: The value you have provided deliberately contains a space? If so, why are you try to add a line separator to it? There is no code in this plugin to manage that.
Mikkel Kjeldsen commented
The value you have provided deliberately contains a space?
It deliberately contains an escaped line break, which javac will reliably interpret as a single argument, because that's how the -Xplugin option must be used. In other words, a hypothetical
<arg>-Xplugin:ErrorProne</arg>
<arg>-Xep:DeadException:WARN</arg>
is an incorrect invocation of javac.
If so, why are you try to add a line separator to it?
Because, not obvious from the reproduction sample I supplied, the Error Prone plugin accepts a lot of arguments and these are much, much easier to organize across multiple lines. One example of that I have handy is jackson-databind, which stretches its configuration over 70 lines, at https://github.com/FasterXML/jackson-databind/blob/2.17/pom.xml#L468-L541; although jackson-databind uses the in-process compiler which doesn't require escaping line breaks.
There is no code in this plugin to manage that.
I am aware of this. All that code is in plexus-compiler (specifically its JavacCompiler), as I have stated. However, I am a consumer of maven-compiler-plugin wherein the error manifests, not of plexus-compiler wherein the error originates, so only filing a ticket with plexus-compiler is insufficient.