频道
bg

Annotation Processor

coding十二月 18, 20211mins
Java

Annotation Processor主要是用来根据注解生成代码, 主要发生编译时。

Javac、或者apt都支持调用预处理器来进行预处理、代码生成。

Javac默认启用了apt,除非通过 -proc:none 选项关闭。处理器的搜索路径可以通过-processorpath 来指定的;不指定的话,会使用user class path 。具体的预处理器类通过搜索路径下的META-INF/services/javax.annotation.processing.Processor 来定义;或者通过-processor 选项来指定。

javac - Java programming language compiler

启用H1

MavenH2

Maven中可以使用apt-maven-plugin插件或者maven-compiler-plugin来处理。

apt-maven-plugin可以声明processor类

xml

<project>
<build>
<plugins>
...
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
<options>
<querydsl.entityAccessors>true</querydsl.entityAccessors>
<querydsl.useFields>false</querydsl.useFields>
</options>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>

maven-compiler-plugin 需要通过META-INF/services/javax.annotation.processing.Processor 来寻找处理类;可以单独指定apt的搜索路径

xml

<project>
<build>
<plugins>
...
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<generatedSourcesDirectory>target/generated-sources/java</generatedSourcesDirectory>
<compilerArgs>
<arg>-Aquerydsl.entityAccessors=true</arg>
<arg>-Aquerydsl.useFields=false</arg>
</compilerArgs>
</configuration>
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<classifier>jpa</classifier>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
</dependencies>
</plugin>
...
</plugins>
</build>
</project>

GradleH2

Gradle不支持手动指定processor,因此Jar包必须声明META-INF/services/javax.annotation.processing.Processor 。Gradle可以通过annotationProcessor 配置来指定的apt的类路径来提高apt的性能(类文件少了,搜索更快),即javac的processorpath

alt text

Annotation processors in Gradle with the annotationProcessor dependency configuration

IDEAH2

IDEA根据Idea或者Maven配置决定是否启用apt,也可以在设置中启用。启用后,apt的类路径默认为user classpath,可以指定;处理类会自动搜索,也可以指定。

Apt库H1

常用的需要apt支持的库

  • lombok
  • querydsl
  • mapstruct

QuerydslH2

Querydsl的apt库有带classfier和不带classfier的,主要区别是带classfier的库中声明了META-INF/services/javax.annotation.processing.Processor

评论


新的评论

匹配您的Gravatar头像

Joen Yu

@2022 JoenYu, all rights reserved. Made with love.