Benjamin Marwell created MCOMPILER-408:
------------------------------------------
Summary: CompileMojo resets project artifacts when used in verify
phase
Key: MCOMPILER-408
URL: https://issues.apache.org/jira/browse/MCOMPILER-408
Project: Maven Compiler Plugin
Issue Type: Bug
Affects Versions: 3.8.1, 3.8.0
Environment: - Maven 3.6.2
- Maven compiler plugin <any>
- errorprone <any>
Reporter: Benjamin Marwell
h2. Problem Description / Setup
I tried to execute the google error-prone plugin in the compile phase, but was
unsatisfied with the outcome. However, it seemed to be a perfect fit for the
{{verify}} phase. Other plugins will also use the verify phase, e.g.
checkstyle. I will also compile it to a different folder (which is
{{target/classes-errorprone}}).
However, when using the CompileMojo, it will always call
[projectArtifact.setFile(dir);|[https://github.com/apache/maven-compiler-plugin/blob/master/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java#L189]].
There is no possibility to override this.
I do think this is not always the wanted behaviour.
Now, when executing
{code:java}
mvn clean verify -Perrorprone {code}
the {{ear}} project will not find the {{war}} anymore, because the war had:
* Compile phase creating target/classes
* package phase, which set projectArtifact.setFile() to the {{.war}} file.
* verify phase, which set projectArtifact.setFile() back to {{target/classes}}.
h2. Reproducible
Always, see above.
h2. Workarounds
Do not execute verify+errorprone together with your main target phase and all
reactor projects (e.g. including ear). But this will need two compile steps
(one for packaging, anothero ne for error-prone).
h2. Expected behaviour
I can execute the maven-compiler-plugin with a compiler plugin like checkstyle
in the verify phase without un-attaching any previous artifacts. At least as
long as I compile into another directory.
h2. Actual behaviour
I cannot execute the compiler in the verify phase again using the
{{maven-compiler-plugin}}, because it will reset my project artifacts.
h2. errorprone configuration
{code:java}
<profile>
<id>errorprone</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>errorprone</id>
<phase>verify</phase>
<goals><goal>compile</goal></goals>
<configuration>
<showWarnings>true</showWarnings>
<compilerArgs>
<arg>-XDcompilePolicy=simple</arg>
<arg>
-Xplugin:ErrorProne
${plugin.errorprone.excluded.paths}
-XepDisableWarningsInGeneratedCode
${plugin.errorprone.additional.checks}
</arg>
<arg>-d</arg>
<arg>${project.build.directory}/classes-ep</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_core</artifactId>
<version>${dependency.errorprone.core.version}</version>
</path>
</annotationProcessorPaths>
<useIncrementalCompilation>true</useIncrementalCompilation>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile> {code}
Note: I use incrementalCompilation=true which behaves like non-incremental
compilation due to a bug which is open since ever.
h2. Proposed sulutions
Either create a new goal (compile-only) or provide a switch to not invoke
[projectArtifact.setFile(outputdir)|[https://github.com/apache/maven-compiler-plugin/blob/master/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java#L189]].
--
This message was sent by Atlassian Jira
(v8.3.4#803005)