自定义注释处理器未运行

时间:2018-07-01 00:00:27

标签: java maven annotations annotation-processing

出于测试原因,我编写了AnnotationProcessor,但它不是由maven执行的。

我正在使用Google的“自动服务”为我创建META-INF数据。

这是处理器:

@SupportedAnnotationTypes({ "test.TestAnnotation" })
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@AutoService(Processor.class)
public class AnnotationProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        System.out.println("Test");
        this.processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Test");
        return true;
    }

}

我还尝试引发异常,创建文件,使用断点运行mvnDebug等。

这是提供处理器的项目的重要组成部分(其余只是groupId,命名等):

<dependencies>
    <dependency>
        <groupId>com.google.auto.service</groupId>
        <artifactId>auto-service</artifactId>
        <version>1.0-rc4</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <compilerArgument>-proc:none</compilerArgument>
            </configuration>
        </plugin>
    </plugins>
</build>

这是使用注释生成代码的项目POM的重要部分:

<dependencies>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>Annotation</artifactId>
        <version>${project.version}</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
        </plugin>
    </plugins>
</build>

我的最终目标是让项目将我的注释处理器添加为依赖项,并且可以立即使用(有点像龙目岛)。

修改 测试注释正在测试类上使用。

3 个答案:

答案 0 :(得分:0)

删除proc:none参数。

它将跳过注释过程。这样@AutoService将无法正常工作。

或者您可以手动添加Java服务文件。

答案 1 :(得分:0)

所以它开始有意义。

您的编译器插件设置有效地禁用了任何注释处理。这是必需的,因为否则编译器将找到服务文件,并尝试加载尚未可用的注释处理器(它将随此模块一起提供)。

但是在那种情况下,您的服务文件也不会生成。因此,不会在目标模块中调用您的处理器。

为了解决您的问题,您可以尝试使用其他方式指定要使用的注释处理器。

例如您可以尝试提供注释处理器路径(从而禁用类路径上的注释处理器查找):

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <annotationProcessorPaths>
                    <annotationProcessorPath>
                        <groupId>com.google.auto.service</groupId>
                        <artifactId>auto-service</artifactId>
                        <version>1.0-rc4</version>
                    </annotationProcessorPath>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

然后不需要<compilerArgument>-proc:none</compilerArgument>

答案 2 :(得分:0)

以下pom有效。 Maven在这里非常严格。在其中没有带有Path或注解ProcessorPath的annotationProcessorPaths,没有带有注解Processor的annotationProcessor(据我所知,这些都带有现成的罐子。

              <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration> 
                        <source>10</source>
                        <target>10</target>
                        <outputDirectory>${generatedSources}</outputDirectory>
                        <annotationProcessorPath>
                              <artifactId>processing</artifactId>
                              <name>annotation_processing</name>    
                              <version>0.0.1-SNAPSHOT</version>                 
                        </annotationProcessorPath>
                    </configuration>
              </plugin>

Maven成功编译并安装。