要在 Java 11 中注册服务提供者,可以使用以下“提供”模块信息条目:
module com.mycompany.mylib {
provides ServiceInterface with ServiceImpl;
}
但是,对于注释处理器,这似乎不起作用。 (注解处理器的特殊之处在于它应该是编译器在编译期间获取实现,而不是在运行时获取应用程序。)
为了测试这一点,我创建了一些 SSCCE上 GitHub .
有2个模块:
java11-sample-annotation-processor
:提供@Foo
注释和 FooApplicationProcessor
java11-sample-lib
: 提供 2 个示例类,均使用 @Foo
注释 预期输出:在
java11-sample-lib
JAR 应该有一个 foo.txt
文件master branch 中的版本是一个有效 :
module-info
二手 src/main/resources/META-INF/services/javax.annotation.processing.Processor
中的注释处理器注册在以下版本中,
foo.txt
文件未生成:在 registration-in-module-info branch我已将 2 个库更改为带有模块信息的 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 branch是 a slight variation ,我指定了目标模块和目标包(硬编码)而不是根包。
在 registration-meta-inf branch仍然都有一个模块信息,但注释处理器在
src/main/resources/META-INF/services/javax.annotation.processing.Processor
中注册而不是在模块信息中(以防编译器无法使用模块信息中的提供语句!?)在 only-one-module branch我已经从
java11-sample-annotation-processor
中删除了模块信息再次。注释处理器在 src/main/resources/META-INF/services/javax.annotation.processing.Processor
中注册.所以我的问题是:在使用 Java 11 模块时如何配置注释处理器?
最佳答案
过去,在编译期间将注释处理器放置在类路径上时会自动检测到注释处理器。你可以从 the documentation 看到这个的 javac
:
--class-path
path,-classpath
path, or-cp
pathSpecifies where to find user class files and annotation processors [emphasis added]. This class path overrides the user class path in the
CLASSPATH
environment variable.
- If
--class-path
,-classpath
, or-cp
are not specified, then the user class path is the value of theCLASSPATH
environment variable, if that is set, or else the current directory.- If not compiling code for modules, if the
--source-path
or-sourcepath
option is not specified, then the user class path is also searched for source files.- If the
-processorpath
option is not specified, then the class path is also searched for annotation processors [emphasis added].[...]
--processor-path
path or-processorpath
pathSpecifies where to find annotation processors. If this option is not used, then the class path is searched for processors [emphasis added].
只要您使用类路径,情况仍然如此。但是,在使用模块路径时,情况并非如此。要检测模块化注释处理器,您必须使用另一个选项显式指向它们:
--module-path
path or-p
pathSpecifies where to find application modules.
[...]
--processor-module-path
pathSpecifies the module path used for finding annotation processors.
没有提到用于自动检测注释处理器的模块路径。
关于Java 11 模块信息 : how to register an annotation processor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60693210/