要在 Java 11 中注册服务提供者,可以使用以下“提供”模块信息条目:
module com.mycompany.mylib {
provides ServiceInterface with ServiceImpl;
}
但是,对于注释处理器,这似乎不起作用。(注解处理器的特殊之处在于它是编译器应该在编译期间获取实现,而不是在运行时获取应用程序。)
为了测试这一点,我在GitHub 上创建了一些SSCCE。
有2个模块:
java11-sample-annotation-processor
: 提供@Foo
注解和FooApplicationProcessor
java11-sample-lib
: 提供 2 个示例类,均使用@Foo
注解
预期输出:在java11-sample-lib
JAR 中应该有一个foo.txt
文件
主分支中的版本是有效的:
- 爪哇 11
- 没
module-info
用过 - 注释处理器注册
src/main/resources/META-INF/services/javax.annotation.processing.Processor
在以下版本中,foo.txt
不会生成该文件:
在registration-in-module-info 分支中,我已将2 个库更改为带有module-info 的Java 11 模块。注释处理器在这里注册在模块信息中:
import com.github.puce77.java11annotationprocessortest.annotation.impl.FooApplicationProcessor;
module com.github.puce77.java11annotationprocessortest.annotation {
exports com.github.puce77.java11annotationprocessortest.annotation;
provides javax.annotation.processing.Processor with FooApplicationProcessor;
requires java.compiler;
}
registration-in-module-info-moduleAndPkg 分支稍有变化,我指定了目标模块和目标包(硬编码)而不是根包。
在registration-meta-inf分支中仍然有一个module-info,但是注解处理器注册在src/main/resources/META-INF/services/javax.annotation.processing.Processor
而不是在module-info中(如果编译器不能在module-info中使用provides语句!?)
在唯一一个模块分支中,我已经从另一个模块中删除了模块信息java11-sample-annotation-processor
。注释处理器注册在src/main/resources/META-INF/services/javax.annotation.processing.Processor
.
所以我的问题是:在使用 Java 11 模块时如何配置注释处理器?