Need help with annotation processor . I have created a simple annotation processor which uses @autoservice annotation that checks whether the field which is annotated is final. But it is not showing any compile time errors. This is my configuration
Annotation:
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
public @interface Store {
int temp() default 0;
}
Annotation Processor:
@SupportedAnnotationTypes("com.self.Store")
@AutoService(Processor.class)
public class Process extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element element : roundEnv.getElementsAnnotatedWith(Store.class)) {
TypeElement typeElement = (TypeElement) element;
for (Element element2 : typeElement.getEnclosedElements()) {
VariableElement variableElement = (VariableElement) element2;
if (!variableElement.getModifiers().contains(Modifier.FINAL)) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "it should be final");
}
}
}
return true;
}
}
pom file:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>annotations</groupId>
<artifactId>annotations</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>annotation</name>
<dependencies>
<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<version>1.0-rc2</version>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Testing file:
public class Test {
@Store
public int id;
}
According to the Baeldung's topic on annotation processor development, you must configure your maven compiler plugin first and declare the auto-service annotation processor there. That is the missing step. FYI, if you are using Gradle you may declare it under dependencies closure:
dependencies {
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc5'
compileOnly 'com.google.auto.service:auto-service:1.0-rc5'
}
It looks like you are missing a step. Running Maven build of this project will invoke the Google AutoService annotation processor, create a registration file for your custom processor, and build a .jar with it. In order for your processor to work, that .jar must be included as a dependency before compiling the project that contains Test
. Otherwise the registration file that must be picked up by Java ServiceLoader is generated during compilation and obviously not included in the compiler's classpath.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With