注释处理器需要在只编译子集时处理所有文件,但是如何?

时间:2014-11-25 05:28:59

标签: maven annotations

我有一个注释处理器,用于查找包含特定注释的文件。处理器的输出是单个文件,它引用每个这样的带注释文件。

例如,如果类 X Y Z 包含注释 @Foo ,那么 @Foo 处理器将生成如下文件:

class FooFiles {

  Class[] getFooClasses() {
    return new Class[]{X.class,Y.class,Z.class};
  }

}

如果我执行mvn clean compile,这可以正常工作,因为所有类都被编译并传递给注释处理器。

但是如果这些类是最新的,并且我只修改了一个(比如 X 类),那么mvn compile将执行增量构建,因为只有编译X 类,然后只将 X 类传递给注释处理器,生成的文件为:

class FooFiles {

  Class[] getFooClasses() {
    return new Class[]{X.class};
  }

}

这很糟糕。

我正在使用带有maven-compiler-plugin版本2.5.1的maven,它似乎在进行渐进式编译。

如果我将maven-compiler-plugin更新为3.1版,那么一个文件中的任何更改都会导致所有文件的编译,并且不会发生此问题(尽管只更改了一个文件时编译所有文件可能不是这里的解决方案,其他开发人员会抱怨当一个带有10K +文件的模块因为一次文件更改而需要从头开始重新编译时。我确实尝试在插件的配置中将useIncrementalCompilation选项设置为true,但它似乎无论如何重新编译所有文件。

我修改了我的注释处理器,以便它不会覆盖任何现有的生成文件。这意味着在clean之后,将生成包含 X Y Z 引用的正确提供程序文件。但是,如果仅 X 发生更改,则不会生成新的提供程序文件。这允许增量编译,但代价是记住在必要时进行clean

我不确定这里是否有一般解决方案,但我还是要问。我想我真正想要的是注释处理器在target/classes阶段之后在compile目录上运行。我可能需要为此编写一个maven插件。

1 个答案:

答案 0 :(得分:1)

有一个bug in maven-compiler-plugin version 3.1. that causes incremental builds to fail。目前最新的版本是3.2。

  

这很糟糕。

只是因为它破坏了您当前的处理器。正如您自己所说,这不是一直重建所有内容的最佳解决方案。更好的方法是支持增量构建。这将使构建更快,并且您的处理器与更多编译器,IDE和构建工具兼容。您可能需要一种新方法来处理带注释的类。

以下是关于如何支持增量构建的思考。

您可以生成一个资源文件,列出您的所有类,然后添加您在增量构建时遇到的每个带注释的类,而不是像FooFiles那样在一个地方收集所有类。每当需要使用FooFiles时,您都可以从该资源文件中读取类。您还需要删除列表中已删除或不再注释的类。

如果您的处理器更复杂,那将不会那么容易,但我仍然可以使用一般方法。您还可以为每个带注释的类生成一个类,如果属性文件不够,则可以在某处动态注册自己。