我正在尝试在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运行构建时什么也没产生。
我非常感谢能帮助我了解自己在做什么错。
谢谢!