2012-07-26 100 views
6

在我们的企业应用程序中,我们正在寻找一种动态的方式从我们的Java类中收集数据。我们使用name属性创建了自定义注释界面(@interface)。我们希望从所有注释类中收集此属性的值。如何在Maven 2中使用自定义注释处理器?

我设法为自定义注释创建了一个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

+0

什么是您的项目层次样子Annotation Processing Tool? – Daniel 2012-07-26 11:20:57

回答

6

两件事情来检查:

  1. 确保main_project(或插件) depends on the project其中包含您的ComponentAnnotationProcessFactory
  2. Apt Maven Plugin的<factory>配置标记对我来说不起作用,但如果插件的完全限定名位于META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory文件中,该插件将查找工厂类。 (见documentation of apt for the details。)

更好的办法是使用(而不是Maven的公寓插件)的annotation processing features of JDK 6,因为它不需要com.sun包和tools.jar从JDK的lib文件夹。

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

更多参考: