如何在Maven 2中使用自定义注解处理器?

8
在我们的企业应用程序中,我们正在寻求一种动态收集来自Java类的数据的方法。我们创建了一个自定义注解接口(@interface),其中包含一个name属性。我们希望从所有带注解的类中收集此属性的值。
我成功创建了一个自定义注解的AnnotationProcessorFactoryAnnotationProcessor。由于我们使用的是Maven 2,因此我在主项目的pom.xml插件中添加了以下内容。
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>apt-maven-plugin</artifactId>
      <version>1.0-alpha-5</version>
      <configuration>
        <factory>our.company.api.component.lister.ComponentAnnotationProcessFactory</factory>
      </configuration>
    </plugin>

这段代码位于主项目中,其中有几个子项目。工厂和自定义处理器位于其中一个子项目中。自定义注释散布在所有子项目中,这就是为什么我将插件放在主项目的pom.xml中的原因。

问题是当我发出mvn apt:process命令时,我收到一个关于没有处理器的注释的警告,其中包括我们的自定义注释。我认为这意味着插件找不到工厂类。

我该怎么做才能让插件找到工厂和处理器文件?

编辑:

项目层次结构非常简单:

main_project
|-sub_project1
|...
|-sub_projectn

插件位于main_projectpom.xml中。假设工厂和处理器位于sub_project1,自定义注解位于sub_project2sub_project3、...、sub_projectn中。


你的项目层次结构是什么样子的? - Daniel
1个回答

7
两个需要检查的事项:
  1. 确保 main_project(或插件)依赖于包含您的 ComponentAnnotationProcessFactory 的项目。
  2. Apt Maven Plugin<factory> 配置标签对我无效,但如果完全限定名称在 META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory 文件中,则插件可以找到工厂类。(有关详细信息,请参见APT 文档。)
更好的方法是使用 JDK 6 的注解处理功能(而不是 Maven Apt 插件),因为它不需要来自JDK 的 com.sun 包和 lib 文件夹中的 tools.jar
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>

            <configuration>
                <source>1.6</source>
                <target>1.6</target>

                <annotationProcessors>
                    <annotationProcessor>
                        com.example.annotationprocessor.Processor
                    </annotationProcessor>
                </annotationProcessors>
            </configuration>
        </plugin>
    </plugins>
</build>

更多参考资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接