Java 如何通过注释处理器生成模块信息?

Java 如何通过注释处理器生成模块信息?,java,code-generation,annotation-processing,java-module,module-info,Java,Code Generation,Annotation Processing,Java Module,Module Info,我有一些代码可以通过java APT在编译时生成一些服务,在java9之前,我通过APT生成java源代码,并使用Google AutoService在META-INF/services文件夹下生成服务文件,现在我想升级到使用java9模块描述模块信息来放置服务定义,但我失败了,请参见下面的代码: 最终字符串MODULE\u FILE\u NAME=模块信息; Writer srcWriter=null; 试一试{ 这个._logger.infoGenerate模块文件为->{},module.

我有一些代码可以通过java APT在编译时生成一些服务,在java9之前,我通过APT生成java源代码,并使用Google AutoService在META-INF/services文件夹下生成服务文件,现在我想升级到使用java9模块描述模块信息来放置服务定义,但我失败了,请参见下面的代码:

最终字符串MODULE\u FILE\u NAME=模块信息; Writer srcWriter=null; 试一试{ 这个._logger.infoGenerate模块文件为->{},module.getName; JavaFileObject fileObj=builderContext.getFiler.createSourceFileMODULE\u FILE\u NAME; //FileObject fileObj=builderContext.getFiler.createResourceStandardLocation.SOURCE\u输出,模块\u文件\u名称; srcWriter=fileObj.openWriter; temp.processmodel,srcWriter; }捕获异常{ ...... 编译代码时,会引发以下异常:

>任务:uapi。服务:compileJava 注: 正在加载外部处理程序。。。 注: uapi.annotation.internal.ModuleHandler 注: uapi.annotation.internal.NotNullHandler 注: 开始处理批注。。。 注: [uapi.service]上的注释模块 注: 正在生成源。。。 注: 为->uapi.service生成模块文件 错误: 为-uapi.service生成模块时出错 错误: 非法名称模块信息 错误: jdk.compiler/com.sun.tools.javac.processing.JavacFiler.checkNameJavacFiler.java:695 jdk.compiler/com.sun.tools.javac.processing.JavacFiler.checknameandesistencejavacfiler.java:715 jdk.compiler/com.sun.tools.javac.processing.JavacFiler.createSourceOrClassFileJavacFiler.java:489 jdk.compiler/com.sun.tools.javac.processing.JavacFiler.createSourceFileJavacFiler.java:426 uapi.codegen.internal.AnnotationProcessor.generateModuleAnnotationProcessor.java:164 uapi.codegen.internal.AnnotationProcessor.processAnnotationProcessor.java:142 org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.processDelegatingProcessor.java:62 org.gradle.api.internal.tasks.compile.processing.NonIncrementalProcessor.processNonIncrementalProcessor.java:45 org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.processDelegatingProcessor.java:62 org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.access$401TimeTrackingProcessor.java:37 org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$5.createTimeTrackingProcessor.java:99 org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$5.createTimeTrackingProcessor.java:96 org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.TrackingTimeTrackingProcessor.java:117 org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.processTimeTrackingProcessor.java:96 jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessorJavacProcessingEnvironment.java:980 jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverandUnpropcsjavacProcessingEnvironment.java:896 jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.runJavacProcessingEnvironment.java:1222 jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessingJavacProcessingEnvironment.java:1334 jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotationsJavaCompiler.java:1258 jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compileJavaCompiler.java:936 jdk.compiler/com.sun.tools.javac.api.javactasquimpl.lambda$doCall$0javactasquimpl.java:104 jdk.compiler/com.sun.tools.javac.api.javactasquimpl.handleExceptionsjavactasquimpl.java:147 ... 如果我使用builderContext.getFiler.createResourceStandardLocation.SOURCE\u输出、模块\u文件\u名称来生成模块信息文件,则可以创建该文件,但javac似乎不编译它

我检查了文件管理器接口的javadoc,它说:

文件创建方法采用可变数量的参数,以允许将原始元素作为提示提供给工具基础结构,从而更好地管理依赖关系。原始元素是表示包信息文件的类型或包,或表示模块信息文件的模块,这导致注释处理器清空以创建新文件

但是createSourceFile和createClassFile似乎都只支持java类型和包信息:

创建一个新的源文件并返回一个允许写入的对象。可以创建类型的源文件或包

那么,我如何在编译时生成模块信息文件呢?或者我必须在编译时使用字节码工具(如ASM)生成module-info.class文件