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

基于Gradle与Java17的注解处理器依赖内部API报错求助

解决Java 17+Gradle 7.5下注解处理器访问javac内部API的模块错误

问题本质

Java 17的模块化系统中,jdk.compiler模块并未将com.sun.tools.javac.tree这类内部API包导出给未命名模块,而注解处理器默认运行在未命名模块中,导致编译时出现访问拒绝错误。


一、修改注解处理器项目的build.gradle配置

编译时需添加模块导出参数,让jdk.compiler开放内部API给注解处理器:

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

tasks.withType(JavaCompile) {
    options.compilerArgs.addAll([
        '--add-modules', 'jdk.compiler',
        '--add-exports', 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED',
        '--add-exports', 'jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED',
        '--add-exports', 'jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED',
        '--add-exports', 'jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED'
        // 根据LocalVariableTranslator实际用到的内部包,补充对应的--add-exports参数
    ])
}

dependencies {
    // 仅编译时依赖javac工具模块
    compileOnly 'jdk.compiler:jdk.compiler:17'
}

若注解处理器项目为模块化项目(包含module-info.java),可将ALL-UNNAMED替换为你的模块名(如org.simple.processor),并在module-info.java中补充:

module org.simple.processor {
    requires jdk.compiler;
    exports org.simple.processor;
    opens org.simple.processor to jdk.compiler;
    provides javax.annotation.processing.Processor with org.simple.processor.YourAnnotationProcessor;
}

二、修改测试项目的build.gradle配置

测试项目编译时会加载执行注解处理器,需添加相同的模块导出参数,同时引入注解处理器依赖:

dependencies {
    // 引入注解处理器(根据实际依赖方式调整,比如本地项目或本地jar)
    annotationProcessor project(':your-processor-module-name')
    // 若为本地jar:annotationProcessor files('libs/processor.jar')
}

tasks.withType(JavaCompile) {
    options.compilerArgs.addAll([
        '--add-modules', 'jdk.compiler',
        '--add-exports', 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED',
        '--add-exports', 'jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED'
        // 与注解处理器项目保持一致的导出参数
    ])
}

三、代码验证

确保LocalVariableTranslator能正确继承内部API类:

import com.sun.tools.javac.tree.TreeTranslator;

public class LocalVariableTranslator extends TreeTranslator {
    // 你的处理器逻辑代码
}

内容的提问来源于stack exchange,提问作者Serhii Kachan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:05:32