【问题标题】:Custom annotation procesor not running自定义注释处理器未运行
【发布时间】:2018-07-01 00:00:27
【问题描述】:

出于测试原因,我编写了一个 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>

我的最终目标是让项目将我的注释处理器添加为依赖项并准备好使用(有点像 lombok)。

编辑 测试注释正在测试类上使用。

【问题讨论】:

    标签: java maven annotations annotation-processing


    【解决方案1】:

    删除proc:none 参数。

    它将跳过注释过程。这样@AutoService 就不起作用了。

    或者你可以手动添加java服务文件。

    【讨论】:

    • 注解正在使用中(很遗憾我忘了提及)。处理器仍然不工作。
    【解决方案2】:

    所以它开始有意义了。

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

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

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

    例如您可以尝试提供注释处理器路径(这反过来会禁用在类路径上查找注释处理器):

    <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>
    

    那么就不需要&lt;compilerArgument&gt;-proc:none&lt;/compilerArgument&gt;了。

    【讨论】:

    • 哎呀。毫无疑问,那个 pom 会起作用。 (我检查了它,它有效)。但它会打开 Google 自动服务处理器。 (可以通过通常的依赖以更简单的方式打开)。问题是如何使我们的或定制的处理器工作。
    【解决方案3】:

    以下 pom 有效。 Maven在这里非常严格。没有带有 Path 或 annotationProcessorPath 的 annotationProcessorPaths,没有带有 annotationProcessor 的 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 编译安装成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      相关资源
      最近更新 更多