我有一个注释处理器,用于查找包含特定注释的文件。处理器的输出是单个文件,它引用每个这样的带注释文件。
例如,如果类 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插件。
答案 0 :(得分:1)
有一个bug in maven-compiler-plugin version 3.1. that causes incremental builds to fail。目前最新的版本是3.2。
这很糟糕。
只是因为它破坏了您当前的处理器。正如您自己所说,这不是一直重建所有内容的最佳解决方案。更好的方法是支持增量构建。这将使构建更快,并且您的处理器与更多编译器,IDE和构建工具兼容。您可能需要一种新方法来处理带注释的类。
以下是关于如何支持增量构建的思考。
您可以生成一个资源文件,列出您的所有类,然后添加您在增量构建时遇到的每个带注释的类,而不是像FooFiles
那样在一个地方收集所有类。每当需要使用FooFiles
时,您都可以从该资源文件中读取类。您还需要删除列表中已删除或不再注释的类。
如果您的处理器更复杂,那将不会那么容易,但我仍然可以使用一般方法。您还可以为每个带注释的类生成一个类,如果属性文件不够,则可以在某处动态注册自己。