Uploaded image for project: 'Maven Compiler Plugin'
  1. Maven Compiler Plugin
  2. MCOMPILER-589

Compilation fails due to removed generated-sources after upgrade from 3.11.0 to 3.12.0+

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 3.12.0, 3.12.1, 3.13.0
    • None
    • None

    Description

      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());
                      }
                  }
      

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              ehubert Eric Hubert
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated: