Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Annotation processor @autoservice

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;
}
like image 350
amt14779 Avatar asked Dec 19 '22 06:12

amt14779


2 Answers

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'
}
like image 51
Romeo Jr Maranan Avatar answered Jan 13 '23 07:01

Romeo Jr Maranan


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.

like image 44
vempo Avatar answered Jan 13 '23 09:01

vempo