2

我在我正在处理的 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 编译器插件来限制基于包结构的复杂性。我的 pom.xml 包含类似于下面的一个,将编译限制为 **com.foo.bar.stuff** 和 **com.baz.foo.more** 中的类。这是不令人满意的,因为当我在 com.xyz.bar.foo 中添加注释类时,我必须记得在 pom.xml 中定义它。

<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

1 回答 1

2

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

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

使用 Java 语言中的注释处理器生成代码 - 第 2 部分:注释处理器

于 2014-01-07T10:46:31.723 回答