@Generated annotation using gradlew + dagger

Tags: , , , ,



I’m confronting a weird issue using gradlew(4.10.2) + dagger(2.18).

The problem is when I call:

./gradlew :app:compileDebugAndroidTestKotlin 

The build fails with:

Task :Common:compileDebugJavaWithJavac FAILED

/CommonModule_ProvidesGsonFactory.java:6: error: package javax.annotation.processing does not exist import javax.annotation.processing.Generated;

/CommonModule_ProvidesGsonFactory.java:8: error: cannot find symbol @Generated(

But if I run the task from Android Studio, the task succeed and the @Generated is not present in the dagger generated class.

Do you have some clue to avoid the @Generated annotation using ./gradlew?

Answer

Dagger uses auto-common‘s GeneratedAnnotations to figure out which @Generated annotation to use. It does this based on the classpath.

What this means is that while the annotation processor is running, javax.annotation.processing.Generated is available and used in the generator, but when the resulting file is compile in another task, it is no longer on the classpath.

Potential causes could be that code was generated using a newer version of the JDK and the incremental build is invalid, requiring a full “clean & rebuild” or there is a problem with java language levels where the annotation processor runs on Java 9+, but android is compiled as Java 8 or lower.

Using ./gradlew compileDebugAndroidTestKotlin -Dorg.gradle.java.home=<Android studio jre path> solved the problem.



Source: stackoverflow