Java 找不到Maven注释处理处理器

Java 找不到Maven注释处理处理器,java,maven,annotations,annotation-processing,Java,Maven,Annotations,Annotation Processing,我是注释处理新手,我正在尝试用Maven自动化它。我在pom.xml中添加了以下内容: <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3

我是注释处理新手,我正在尝试用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>

org.apache.maven.plugins
这是处理器项目上maven clean安装的输出。不幸的是,输出太长,我不得不发布一个外部链接,即使我知道它不好

编辑4

下面是我的依赖关系层次结构的一些屏幕截图:和


因为这个项目最初是作为一个Eclipse简单Java项目创建的,然后转换成了一个Maven项目,所以我尝试创建一个新的Maven项目,并将所有东西都转移到新的项目中,希望问题是Eclipse插件把事情搞砸了,但是错误仍然存在。

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

检查它是否已经注册,如果没有,如果您控制源代码,请自己注册


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

我自己找到了答案。我发现问题出在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>

org.apache.maven.plugins
maven编译器插件
3.5.1
-过程:无
1.7
1.7

这让Maven将类构建到实际的jar中并修复了问题。我不知道这是不是一个错误,但它肯定看起来很奇怪。谢谢大家的帮助

这是@Aurasphere提供的上述公认答案的扩展版本。希望这能对提议的解决方案的工作原理给出一些解释

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

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

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

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

maven编译器插件
没有一个
我们可能有需要注释处理器的单元测试。在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>

maven编译器插件
过程测试注释
生成测试资源
测试编译
只有
完全限定名

请发布您如何定义co.aurasphere.revolver…包的依赖项。它们不在您试图编译的项目中,是吗?请注意,在您构建使用注释处理器的项目之前,您必须构建注释处理器。这个答案确实帮助了我,并且很快就解决了问题。非常感谢你!
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <proc>none</proc>
    </configuration>
</plugin>
<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>