【问题标题】:Maven annotation processing processor not found未找到 Maven 注释处理处理器
【发布时间】:2016-08-12 20:49:07
【问题描述】:

我是注释处理的新手,我正在尝试使用 Maven 将其自动化。我把它放在我的 pom.xml 中:

<plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <annotationProcessors>
                    <annotationProcessor>
                        co.aurasphere.revolver.annotation.processor.InjectAnnotationProcessor</annotationProcessor>
                    <annotationProcessor>
                        co.aurasphere.revolver.annotation.processor.RevolverContextAnnotationProcessor</annotationProcessor>
                </annotationProcessors>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>

问题是,当我尝试构建项目时,我得到了 CompilationFailureException,因为 Maven 找不到处理器。

我发现了其他类似的问题,通过将依赖项放在插件之外来解决。我试过了,但对我来说没有任何改变。

我错过了什么吗?

谢谢。

编辑

这是我对另一个同时包含处理器和注释的项目的依赖:

    <dependencies>
    <dependency>
        <groupId>co.aurasphere</groupId>
        <artifactId>revolver-annotation-processor</artifactId>
        <version>0.0.3-SNAPSHOT</version>
    </dependency>
</dependencies>

编辑 2

经过进一步调查,我决定反编译处理器 JAR(使用 Maven 构建),碰巧……我的类不存在。由于某些原因,Maven 没有将我的类编译到 JAR 中,这就是找不到这些类的原因。我已经尝试弄清楚该构建出了什么问题(这在我之前从未发生过,而且我已经使用 Maven 一段时间了......)。

首先,该项目的包装是jar。 这些类都在 src/main/java 下。 我在 pom.xml 中检查了类路径和源路径是相同的。

这是处理器 pom:

<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>co.aurasphere</groupId>
<artifactId>revolver-annotation-processor</artifactId>
<version>0.0.3-SNAPSHOT</version>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins> 
</build>
<dependencies>
    <!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity -->
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>1.7</version>
    </dependency>


</dependencies>

编辑 3

Here 是处理器项目上的 Maven 全新安装的输出。不幸的是,输出太长了,即使我知道它不好,我也不得不发布一个外部链接。

编辑 4

以下是我的依赖层次结构的一些屏幕截图:

由于该项目最初是作为 Eclipse 简单 Java 项目创建的,然后转换为 Maven 项目,因此我尝试创建一个新的 Maven 项目并将所有内容移至新项目,希望问题出在 Eclipse 插件搞砸了出了点问题,但错误仍然存​​在。

【问题讨论】:

  • 请发布您如何定义对co.aurasphere.revolver... 包的依赖项。它们不在您尝试编译的项目内部,是吗?
  • 请注意,您必须在构建使用它们的项目之前构建注释处理器。

标签: java maven annotations annotation-processing


【解决方案1】:

这是@Aurasphere 提供的上述已接受答案的扩展版本。希望这可以解释所提议的解决方案是如何工作的。

首先,这里发生的事情的一些背景。比如说,我们想要一个自定义注释处理器。我们实现它并将其作为 Maven 工件放入 JAR 中,以便其他项目可以使用它。在编译此类项目时,我们希望我们的注解处理器能够被 Java 编译器识别并正确使用。为了实现这一点,需要告诉编译器一个新的定制处理器。编译器查看资源并检查META-INF/services/javax.annotation.processing.Processor 文件中列出的类的 FQN。它尝试在类路径中找到这些类并加载它们以运行对当前正在编译的类上使用的注释的处理

因此,我们希望在此文件中提及我们的自定义类。我们可以要求我们库的用户手动放置这个文件,但这并不直观,用户可能会因为所承诺的注释处理不起作用而感到沮丧。这就是为什么我们可能要提前准备这个文件,并将它与我们的 Maven 工件的 JAR 中的处理器一起交付。

问题在于,如果我们简单地将这个带有自定义处理器的 FQN 的文件放入其中,它会在编译我们的工件时触发编译器,并且由于处理器本身还没有编译,所以编译器将显示有关它的错误。所以我们需要跳过注释处理来避免这种情况。这可以使用-proc:none 或使用 Maven 来完成:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <proc>none</proc>
    </configuration>
</plugin>

我们可能有需要注释处理器的单元测试。在 Maven 中,在构建主要源代码之后进行测试编译,并且所有类都已经可用,包括我们的处理器。我们只需要在处理将使用我们的注释处理器的测试源期间添加特殊步骤。这可以使用:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
        <execution>
            <id>process-test-annotations</id>
            <phase>generate-test-resources</phase>
            <goals>
                <goal>testCompile</goal>
            </goals>
            <configuration>
                <proc>only</proc>
                <annotationProcessors>
                    <annotationProcessor>fully.qualified.Name</annotationProcessor>
                </annotationProcessors>
            </configuration>
        </execution>
    </executions>
</plugin>

【讨论】:

  • 这个答案真的帮了我很多忙,而且很快就解决了。非常感谢!
【解决方案2】:

我自己找到了答案。我发现问题出在 META-INF/services/ 中的文件 javax.annotation.processing.Processor 与注释处理器类的配置。为了解决这个问题,我必须在我的处理器项目的 pom.xml 配置中添加以下内容:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <compilerArgument>
                    -proc:none
                </compilerArgument>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

这让 Maven 将类构建到实际的 jar 中并解决了问题。我不知道这是否是一个错误,但它对我来说确实很奇怪。谢谢大家的帮助!

【讨论】:

    【解决方案3】:

    最简单的方法是在 revolver-annotation-processor 工件的 META-INF/services 目录中注册注解处理器。无需 Maven 编译器配置。

    检查是否已经注册,如果没有,请控制源码自行注册。

    https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html

    如果您控制源代码,我还建议将处理器打包在与注释相同的工件中。像这样,每当您使用其中一个注解时,编译器也会拾取注解处理器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      相关资源
      最近更新 更多