You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:04:51