Tibor Varga created MCOMPILER-240:
-------------------------------------

             Summary: Generated sources directory should not be added to 
compiler's source roots
                 Key: MCOMPILER-240
                 URL: https://jira.codehaus.org/browse/MCOMPILER-240
             Project: Maven Compiler Plugin
          Issue Type: Bug
    Affects Versions: 3.2
         Environment: Apache Maven 3.2.5 
(12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T18:29:23+01:00)

Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)

Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

            Reporter: Tibor Varga
         Attachments: code-generation-test-case.tar.bz2, 
Generated_sources_directory_added_to_source_roots_after_compilation.patch

I am using annotation processors with Maven and I keep getting errors when 
compiling with generated sources already present from a previous run.

I have modified one of the test cases submitted for 
[MCOMPILER-157|http://jira.codehaus.org/browse/MCOMPILER-157] to induce the 
error by generating a source file _as source file_ rather than as a resource. 
Untar the test case and run {{mvn clean test -q && mvn test -q}} to verify.

What I found is that {{AbstractCompilerMojo}} in version 3.2 of the compiler 
plugin adds the generated sources directory to the compiler's source root list, 
and that has two undesirable effects:

# Sources generated in the previous run will be stale the next time around and 
cause recompilation.
# The compiler will consider the previously generated source files to be 
initial inputs.

The first one is mostly harmless but the second one is deadly, as it breaks the 
processing environment of the annotation processors.

>From the {{javax.annotation.Filer}} documentation in JDK 8:

bq. "During each run of an annotation processing tool, a file with a given 
pathname may be created only once. Any subsequent attempt to create the same 
file during a run will throw a FilerException [...] The initial inputs to the 
tool are considered to be created by the zeroth round; therefore, attempting to 
create a source or class file corresponding to one of those inputs will result 
in a FilerException."

Thus by adding the generated sources directory to the compiler's source roots, 
the compiler plugin causes annotation processors to inadvertently break their 
contract with the compiler.

I get the expected behavior when lines 511-540 in {{AbstractCompilerMojo}} are 
moved after the compiler invocation, say to line 806. See the attached patch.



--
This message was sent by Atlassian JIRA
(v6.1.6#6162)

Reply via email to