4

I have some codes to generate some services at compiling time by java APT, before java9, I generate java source code by APT, and using Google AutoService to generate service file under META-INF/services folder, now I want to upgrade it to use Java9 module description (module-info) to put service definition, but I failed, see below codes:

final String MODULE_FILE_NAME = "module-info";
        Writer srcWriter = null;
        try {
            this._logger.info("Generate module file for -> {}", module.getName());
            JavaFileObject fileObj = builderContext.getFiler().createSourceFile(MODULE_FILE_NAME);
//            FileObject fileObj = builderContext.getFiler().createResource(StandardLocation.SOURCE_OUTPUT, "", MODULE_FILE_NAME);
            srcWriter = fileObj.openWriter();
            temp.process(model, srcWriter);
        } catch (Exception ex) {
......

Compile the code, it throws exception below:

> Task :uapi.service:compileJava
注: Loading external handlers...
注:      uapi.annotation.internal.ModuleHandler
注:      uapi.annotation.internal.NotNullHandler
注: Start processing annotations...
注:      Annotation Module on [uapi.service]
注: Generating sources...
注: Generate module file for -> uapi.service
错误: An error was risen when generate module for - uapi.service
错误: Illegal name module-info
错误:     jdk.compiler/com.sun.tools.javac.processing.JavacFiler.checkName(JavacFiler.java:695)
        jdk.compiler/com.sun.tools.javac.processing.JavacFiler.checkNameAndExistence(JavacFiler.java:715)
        jdk.compiler/com.sun.tools.javac.processing.JavacFiler.createSourceOrClassFile(JavacFiler.java:489)
        jdk.compiler/com.sun.tools.javac.processing.JavacFiler.createSourceFile(JavacFiler.java:426)
        uapi.codegen.internal.AnnotationProcessor.generateModule(AnnotationProcessor.java:164)
        uapi.codegen.internal.AnnotationProcessor.process(AnnotationProcessor.java:142)
        org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.process(DelegatingProcessor.java:62)
        org.gradle.api.internal.tasks.compile.processing.NonIncrementalProcessor.process(NonIncrementalProcessor.java:45)
        org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.process(DelegatingProcessor.java:62)
        org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.access$401(TimeTrackingProcessor.java:37)
        org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$5.create(TimeTrackingProcessor.java:99)
        org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$5.create(TimeTrackingProcessor.java:96)
        org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.track(TimeTrackingProcessor.java:117)
        org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.process(TimeTrackingProcessor.java:96)
        jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980)
        jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:896)
        jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1222)
        jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1334)
        jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1258)
        jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:936)
        jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
        jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:147)
...

If I use builderContext.getFiler().createResource(StandardLocation.SOURCE_OUTPUT, "", MODULE_FILE_NAME) to generate module-info file, the file can be created but seems javac do not compile it.

I checked javadoc for Filer interface, it said:

The file creation methods take a variable number of arguments to allow the originating elements to be provided as hints to the tool infrastructure to better manage dependencies. The originating elements are the types or packages (representing package-info files) or modules (representing module-info files) which caused an annotation processor to attempt to create a new file.

But both createSourceFile and createClassFile seems only supports java type and package (package-info):

Creates a new source file and returns an object to allow writing to it. A source file for a type, or a package can be created.

So how do I generate module-info file at compiling time? Or I have to using bytecode tool like ASM to generate module-info.class file at compiling time?

min
  • 41
  • 1

0 Answers0