为什么未触发kapt?

时间:2018-11-26 07:20:50

标签: gradle kotlin kapt

我正在尝试在Kotlin项目中实现一些基于注释的代码生成,但是注释处理似乎没有被触发。

整个项目由三个独立的项目组成:

  • 定义注释的“库模块”和一些应用注释的类,
  • 定义处理器的“处理器模块”,该处理器基于上述注释所标注的类的存在来生成Kotlin代码,并且
  • 顶级父项目

此设置是一个多项目Gradle构建,布局如下:

.
├── library-module
│   ├── build.gradle
│   └── src
│       └── main
│           └── java
│               ├── MyAnnotatedClass.kt
│               └── MyAnnotation.kt
│
├── processor-module
│   ├── build.gradle
│   └── src
│       └── main
│           ├── java
│           │   └── MyAnnotationProcessor.kt
│           └── resources
│               └── META-INF
│                   └── services
│                       └── javax.annotation.processing.Processor
│
└── build.gradle

library-module / build.gradle

此项目的此构建不包含与注释处理有关的任何逻辑。但是,源代码确实取决于将由注释处理器生成的代码。

处理器模块/build.gradle

dependencies {
  compileOnly project(':library-module')
}

该项目还有一个src/main/resources/META-INF/services/javax.annotation.processing.Processor文件,其中包含一行,该行是注释处理器类的全限定名称。

顶级build.gradle

plugins {
  id "org.jetbrains.kotlin.kapt" version "1.3.10"
}

dependencies {
  implementation project(':library-module')
  compileOnly project(':processor-module')
  kapt project(':processor-module')
}

此刻,我已经硬编码MyAnnotationProcessor.process()来简单地无条件地写源文件:

@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("MyAnnotation")
@SupportedOptions(RoutesProcessor.KAPT_KOTLIN_GENERATED_OPTION_NAME)
class MyAnnotationProcessor : AbstractProcessor() {
  companion object {
    const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated"
  }

  override fun process(annotations: MutableSet<out TypeElement>, roundEnv: RoundEnvironment): Boolean {
    val greeterClass = ClassName("", "Greeter")

    val file = FileSpec.builder("", "HelloWorld")
        .addType(TypeSpec.classBuilder("Greeter")
            .primaryConstructor(FunSpec.constructorBuilder()
                .addParameter("name", String::class)
                .build())
            .addProperty(PropertySpec.builder("name", String::class)
                .initializer("name")
                .build())
            .addFunction(FunSpec.builder("greet")
                .addStatement("println(%S)", "Hello, \$name")
                .build())
            .build())
        .build()

    file.writeTo(System.out)

    return true
  }
}

...但是通过Gradle或IntelliJ运行构建时什么也没产生。

我非常感谢能帮助我了解自己在做什么错。

谢谢!

0 个答案:

没有答案