找不到 Maven 注释处理处理器

Maven annotation processing processor not found

我是注释处理的新手,我正在尝试使用 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 全新安装的输出。不幸的是输出太长了,我不得不 post 一个外部 link 即使我知道它不好。

编辑 4

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

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

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

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

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

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

我自己找到了答案。我发现问题出在 META-INF/services/ 中的文件 javax.annotation.processing.Processor 与注释处理器的 class 配置。为了解决这个问题,我必须将以下内容添加到我的处理器项目的 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 将 classes 构建到实际的 jar 中并解决了问题。我不知道这是否是一个错误,但它对我来说肯定看起来很奇怪。谢谢大家的帮助!

这是@Aurasphere 提供的上述已接受答案的扩展版本。希望这将对所提出的解决方案的工作原理做出一些解释。

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

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

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

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

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

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