如何解决Kotlin注解处理器导入com.sun.tools.javac.code.Attribute编译报错?
解决Kotlin注解处理器无法导入com.sun.tools.javac.code.Attribute的问题
这个问题我之前也碰到过——Android Studio能识别类但编译报错,本质是com.sun.tools.javac相关类属于JDK自带的tools.jar(Java 8及以下),但Gradle默认不会自动把它加入编译路径。IDE能识别是因为它关联了本地JDK的完整库,但编译时Gradle的依赖规则没覆盖到这块。
下面分Gradle的两种配置方式给你解决方案:
1. 若使用Gradle Kotlin DSL(build.gradle.kts)
针对Java 8及以下版本
在注解处理器模块的build.gradle.kts中添加依赖配置:
dependencies { // 保留你已有的kotlin-stdlib、kotlinpoet依赖 compileOnly(files(System.getProperty("java.home") + "/../lib/tools.jar")) }
针对Java 9及以上版本(模块化JDK)
Java 9开始移除了tools.jar,相关类被整合到java.compiler模块中,需要添加模块编译参数:
tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" // 替换为你的目标JVM版本 kotlinOptions.freeCompilerArgs += listOf("--add-modules", "java.compiler") } dependencies { // 保留已有依赖 compileOnly("javax.annotation:javax.annotation-api:1.3.2") // 部分场景需补充此依赖 }
2. 若使用Gradle Groovy DSL(build.gradle)
Java 8及以下版本
dependencies { // 保留已有依赖 compileOnly files(System.getProperty('java.home') + '/../lib/tools.jar') }
Java 9及以上版本
tasks.withType(KotlinCompile) { kotlinOptions.jvmTarget = "1.8" kotlinOptions.freeCompilerArgs += ['--add-modules', 'java.compiler'] } dependencies { // 保留已有依赖 compileOnly 'javax.annotation:javax.annotation-api:1.3.2' }
额外注意事项
- 确保你的注解处理器模块是Java/Kotlin Library类型(而非Android应用模块),Android模块的类路径规则有差异。
- 用
compileOnly而非implementation依赖:这类JDK自带类库在运行时会由JDK提供,无需打包进处理器的jar包。 - 如果你是在Android项目中使用该处理器,主应用模块的
annotationProcessor依赖配置应该已经完成(毕竟你说处理器能正常运行),无需额外调整。
内容的提问来源于stack exchange,提问作者tse
相关产品推荐
相关产品推荐

