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

[MCOMPILER-589] Compilation fails due to removed generated-sources after upgrade from 3.11.0 to 3.12.0+

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

Eric Hubert opened MCOMPILER-589 and commented

After upgrading the used maven-compiler-plugin from 3.11.0 to 3.13.0 the class compilation fails, because generated resources are no longer present in the generated-sources folder.

The project is setup in a way that during the generate-sources phase a plugin generates java sources which are stored in the configured generated-sources folder. Within the same phase these are added to the source using the build-helper-maven-plugin's add-source goal.

When debugging the maven execution one can verify how the files are generated and placed in the correct folder. Once the maven-compiler-plugin > 3.11.0 is executed, the generated sources are deleted before the actual source code is compiled finally resulting in a compilation error. The issue can be reproduced with 3.12.1 and 3.12.0 and does not happen with 3.11.0.

I did not yet find the time to debug the plugin, but briefly checked the release notes and found the ticket MCOMPILER-333 which might be the cause.

Update: I now disabled incremental compilation by adding

-Dmaven.compiler.useIncrementalCompilation=false

on the command line to the Maven execution and all compiles fine and the generated-sources are used as expected. I think this way I put more evidence towards the changeset of MCOMPILER-333 to be the cause (therefore linking the ticket).

I now also had a glance at the source code and have to admit that I do not really understand the reasoning of this change introducing an unconditional deletion of ALL files under generated-sources for incremental compilation (which is active by default). The generated sources are usually generated for a reason and must be processed during compilation. I'd expect this to break many use cases. What do I overlook here? I cannot see any direct relation to annotation processing as specified in the error message.

// MCOMPILER-333: Cleanup the generated source files created by annotation processing
// to avoid issues with `javac` compiler when the source code is rebuild.
if (getGeneratedSourcesDirectory() != null) {
    try (Stream<Path> walk =
            Files.walk(getGeneratedSourcesDirectory().toPath())) {
        walk.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
        // MCOMPILER-567: The directory must already exist because javac does not create it.
        Files.createDirectories(getGeneratedSourcesDirectory().toPath());
    } catch (IOException ex) {
        getLog().warn("I/O error deleting the annotation processing generated files: " + ex.getMessage());
    }
}

Affects: 3.12.0, 3.12.1, 3.13.0

Issue Links:

  • MCOMPILER-333 Incremental compilation causes "mvn clean compile compile" to fail ("is caused by")

jira-importer avatar Apr 18 '24 17:04 jira-importer

Slawomir Jaranowski commented

Thanks for reporting. Please provide a simple project which can be used to reproduce your issue.

jira-importer avatar Apr 18 '24 23:04 jira-importer

Eric Hubert commented

It looks like we can close the issue as invalid. It all seems to be caused by a wrong/unintended configuration of the compiler plugin in the Maven project which I think was a result of a non-optimal naming of the compiler plugin's configuration parameter "generatedSourcesDirectory". Other than the name may make suggest, it is only meant to be used for sources generated by annotation processors (also properly documented via JavaDoc). With this in mind, the above code (specifically the comments and the error message make totally sense). The project was configured like this:

<generatedSourcesDirectory>${project.basedir}/generated-sources</generatedSourcesDirectory>

placing annotation generated sources (if there were any) right next to other generated sources instead of as by default in a subdirectory annotations. All the years this configuration never caused issues, but with the added cleaning of this directory before the compilation not only annotation processor generated sources, but all sources were removed resulting in compilation errors.

jira-importer avatar Apr 19 '24 09:04 jira-importer