4

要在 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-libJAR 中应该有一个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 模块时如何配置注释处理器?

4

1 回答 1

3

过去,在编译期间将注释处理器放置在类路径上时会自动检测到注释处理器。您可以从以下文档中看到这一点javac

--class-path 路径-classpath 路径-cp 路径

指定在哪里可以找到用户类文件和注释处理器 [强调添加]。此类路径覆盖CLASSPATH环境变量中的用户类路径。

  • 如果未指定--class-path-classpath-cp,则用户类路径是CLASSPATH环境变量的值(如果已设置),否则为当前目录。
  • 如果不为模块编译代码,如果未指定--source-pathor-sourcepath选项,则还会在用户类路径中搜索源文件。
  • 如果-processorpath未指定该选项,则还会在类路径中搜索注释处理器 [强调添加]

[...]

--processor-path 路径-processorpath 路径

指定在哪里可以找到注释处理器。如果未使用此选项,则在类路径中搜索处理器 [强调添加]

只要您使用类路径,情况仍然如此。但是,在使用模块路径时,情况并非如此。要检测模块化注释处理器,您必须使用另一个选项显式指向它们:

--module-path 路径-p 路径

指定在哪里可以找到应用程序模块。

[...]

--processor-module-path 小路

指定用于查找注释处理器的模块路径。

没有提到用于自动检测注释处理器的模块路径。

于 2020-03-15T13:56:53.090 回答