maven-compiler-plugin icon indicating copy to clipboard operation
maven-compiler-plugin copied to clipboard

[MCOMPILER-572] Multi-line <arg> does not work on Windows when forked

Open jira-importer opened this issue 1 year ago • 5 comments

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:

jira-importer avatar Jan 24 '24 20:01 jira-importer

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.

jira-importer avatar Jan 25 '24 11:01 jira-importer

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.

jira-importer avatar Jan 25 '24 16:01 jira-importer

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.

jira-importer avatar Jan 25 '24 22:01 jira-importer

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.

jira-importer avatar Jan 26 '24 05:01 jira-importer

Michael Osipov commented

OK, I see. Need to apologize, you case seems valid and edgy.

jira-importer avatar Jan 27 '24 14:01 jira-importer