Java 11 模块信息 : how to register an annotation processor

标签 java java-11 annotation-processing module-info

要在 Java 11 中注册服务提供者,可以使用以下“提供”模块信息条目:

module com.mycompany.mylib {

    provides ServiceInterface with ServiceImpl;

}

但是,对于注释处理器,这似乎不起作用。 (注解处理器的特殊之处在于它应该是编译器在编译期间获取实现,而不是在运行时获取应用程序。)

为了测试这一点,我创建了一些 SSCCEGitHub .

有2个模块:
  • java11-sample-annotation-processor :提供@Foo注释和 FooApplicationProcessor
  • java11-sample-lib : 提供 2 个示例类,均使用 @Foo注释

  • 预期输出:java11-sample-lib JAR 应该有一个 foo.txt文件

    master branch 中的版本是一个有效 :
  • Java 11
  • 没有 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 brancha 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 path

    Specifies 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 the CLASSPATH 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 path

    Specifies 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 path

    Specifies where to find application modules.

    [...]

    --processor-module-path path

    Specifies the module path used for finding annotation processors.



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

    关于Java 11 模块信息 : how to register an annotation processor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60693210/

    相关文章:

    Java - Java Web 应用程序中文件的相对路径

    java - 如何使用 Java 8 Stream 从某些类属性中获取列表?

    java - 我可以使用 JPA 通过查询语言更新表的多列吗

    java - 我可以在编译时从注释处理器中的 TypeVariable 或 VariableElement 获取底层类上的方法列表吗

    java - 使用 GUICE 注入(inject) HttpClient 以在 Java 中获取模拟响应

    Weblogic 12.2.1 应用程序服务器 JDK 11 支持

    java - 使用 gradle 和 java9+ 的自动模块的依赖关系问题

    java - 无法将裸机 web 应用程序部署到运行 openjdk 11 的 tomee 7.1.0

    gradle - 问题让 Gradle apt 插件与 QueryDSL、lombok 和 mapstruct 一起工作

    java - Kotlin 不识别 Java 保留关键字