Maven编译器,只编译带注释的类

时间:2014-01-07 10:36:39

标签: java maven maven-2 annotations maven-compiler-plugin

我在Maven 2项目中创建了一个自定义Java注释(下面的代码):

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MYANNOTATION{}

在Maven构建的一部分,我只想编译用这个注释注释的类,例如:

@MYANNOTATION
public class MyClass {
    // Code here
}

我目前正在使用Maven Compiler Plugin来限制基于包结构的复杂功能。我的pom.xml包含类似下面的那个,限制编译到** com.foo.bar.stuff **和** com.baz.foo.more **中的类。这是不能令人满意的,因为当我向com.xyz.bar.foo添加带注释的类时,我必须记住在pom中定义它。

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <executions>
          <execution>
            <id>default-compile</id>
            <phase>compile</phase>
            <goals>
              <goal>compile</goal>
            </goals>
            <configuration>
              <includes>
                <include>**/com/foo/bar/stuff/**</include>
                <include>**/com/baz/foo/more/**</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

有没有办法定义Maven只编译已使用此批注注释的类,而不是取决于它们在包层次结构中的位置?

(我试图从域模型类生成元模型,因此我可以指向字段和方法而不将名称定义为字符串常量 - 并在重构时手动更改它们)

编辑:我已在构建阶段的另一部分进行注释处理。系统的工作方式如下:

  1. 编译指定包中的类
  2. 使用JAnnocessor,使用@MYANNOTATION
  3. 从类构建元模型
  4. 编译其余类
  5. 从其他类到元模型类的依赖性阻止了一次性编译所有内容,除非我们将带注释的类移动到另一个项目并向其添加依赖项。这是一种可能性,但可以增加复杂性,因为当前的项目结构似乎形成了一个逻辑整体。

1 个答案:

答案 0 :(得分:2)

您可以使用注释处理执行类似的操作。我不认为你需要做任何特定于maven的事情,但你需要编写一个注释处理器,它必须是一个单独的库的一部分或单独编译。

在这篇博文中很好地解释了注释处理的概念:

  

Code Generation using Annotation Processors in the Java language – part 2: Annotation Processors