未找到Maven注释处理处理器

时间:2016-08-12 20:49:08

标签: java maven annotations annotation-processing

我是注释处理的新手,我正在尝试使用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 clean install的输出。不幸的是输出太长了,即使我知道它不好也不得不发布外部链接。

编辑4

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

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

1 个答案:

答案 0 :(得分:3)

这是@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>