基于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
相关产品推荐
相关产品推荐

