gradle-incap-helper
Helper library and annotation processor for building incremental annotation processors
Gradle 4.7 came (in April 2018) with some level of incremental annotation processing support. Gradle 4.8 went farther by making it possibly dynamic.
This library and annotation processor helps you generate the META-INF descriptor,
and return the appropriate value from your processor's getSupportedOptions() if it's dynamic.
Usage
Add the
incaplibrary to your compile-time dependencies, and theincap-processorto your annotation processor path:with Gradle
gradle dependencies { // you can use compileOnlyApi (or even compileApi) if you're only using isolating or aggregating processors (i.e. no dynamic processor) implementation("net.ltgt.gradle.incap:incap:${incap.version}") annotationProcessor("net.ltgt.gradle.incap:incap-processor:${incap.version}") }with Maven
xml <dependencies> <dependency> <groupId>net.ltgt.gradle.incap</groupId> <artifactId>incap</artifactId> <version>${incap.version}</version> <!-- you can use provided and/or optional if you're only using isolating or aggregating processors (i.e. no dynamic processor) --> <!-- <scope>provided</scope> <optional>true</optional> --> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <annotationProcessorPaths> <path> <groupId>net.ltgt.gradle.incap</groupId> <artifactId>incap-processor</artifactId> <version>${incap.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>Annotate your annotation processor with
@IncrementalAnnotationProcessor@IncrementalAnnotationProcessor(ISOLATING) public class MyProcessor extends AbstractProcessor {If the choice of incrementality support is dynamic (i.e. you used the
DYNAMICvalue above), use theIncrementalAnnotationProcessorTypeenumeration'sgetProcessorOption()from yourgetSupportedOptions()to get the appropriate constant.@Override public Set<String> getSupportedOptions() { if (someCondition) { return Collections.singleton(ISOLATING.getProcessorOption()); } else { // Non-incremental return Collections.emptySet(); } }
Acknowledgements
This processor works great with @AutoService,
which also inspired some of the code here.
Shout-out Gradle, Inc. (and Groupon) who built this feature.
