我正在尝试开发一个Kotlin AnnotationProcessor库,我无法理解为什么会出现这个错误:
错误:任务':app:javaPreCompileDebug'执行失败 >必须立即显式声明注释处理器。发现以下对编译类路径的依赖包含注释处理器。请将它们添加到annotationProcessor配置中 - compiler.jar(project:compiler)
或者,设置android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true以继续之前的行为。请注意,此选项已弃用,将来会被删除 有关详细信息,请参阅https://developer.android.com/r/tools/annotation-processor-error-message.html。
我知道,如我所知,我可以使用includeCompileClasspath = true
,我尝试了它,它运行正常。但正如提到的那样,它已经被弃用,很快就被删除了,并且它有望用于你根据android doc不使用的库。
所以我正在寻找更清洁的解决方案。
Hello.kt
@HelloGenerated
class Hello(){
override fun showLog() {
Log.i(Hello::class.simpleName, "${Gahfy_Hello().getName()}")
}
}
的build.gradle
依赖关系{ kapt项目(“:编译器”) compileOnly项目(“:编译器”) 实现“org.jetbrains.kotlin:kotlin-reflect:$ kotlin_version” }
HelloGenerated.kt
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class HelloGenerated
我也试过没有目标和保留并且有同样的问题
HelloGenerator.kt
@SupportedAnnotationTypes("net.gahfy.HelloGenerated")
class HelloGeneratedInjectorProcessor: AbstractProcessor() {
override fun getSupportedAnnotationTypes(): MutableSet<String> {
return mutableSetOf(HelloGenerated::class.java.name)
}
override fun getSupportedSourceVersion(): SourceVersion {
return SourceVersion.latest()
}
override fun process(annotations: MutableSet<out TypeElement>, roundEnv: RoundEnvironment): Boolean {
val annotation = annotations.firstOrNull { it.toString() == "net.gahfy.HelloGenerated" } ?: return false
for (element in roundEnv.getElementsAnnotatedWith(annotation)) {
val className = element.simpleName.toString()
val `package` = processingEnv.elementUtils.getPackageOf(element).toString()
generateClass(className, `package`)
}
return true
}
private fun generateClass(className: String, `package`: String) {
val kotlinGeneratedPath = (processingEnv.options["kapt.kotlin.generated"] as String).replace("kaptKotlin", "kapt")
val kaptKotlinGenerated = File(kotlinGeneratedPath)
val source = "package $`package`\n\nclass Lachazette_$className(){fun getName():String{return \"World\"}}"
val relativePath = `package`.replace('.', File.separatorChar)
val folder = File(kaptKotlinGenerated, relativePath).apply { if(!exists()){mkdirs()} }
File(folder, "Lachazette_$className.kt").writeText(source)
}
companion object {
const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated"
}
}
的build.gradle
apply plugin: 'java-library'
apply plugin: 'kotlin'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
}
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
资源/ META-INF /服务/ javax.annotation.processing.Processor
net.gahfy.HelloGenerator
我现在正在寻找比includeCompileClasspath = true
更清洁的解决方案。
一些信息:
includeCompileClasspath = true
非常感谢
答案 0 :(得分:1)
不确定这是否与您的问题100%相关,但在将自动值移至kapt
后我遇到了同样的错误。我通过将自动值依赖声明为kapt
和 annotationProcessor
来解决它。
所以在你的情况下:
dependencies{
kapt project(":compiler")
annotationProcessor project(":compiler")
compileOnly project(":compiler")
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
}