Gradle 4.6下如何查找提供注解处理器的违规依赖
嘿,这个问题我之前帮不少开发者踩过坑,Gradle 4.6开始明确提醒要把注解处理器从compile classpath移到processor path,先得揪出哪些依赖在违规搞事情。下面几个方法亲测好用:
1. 用Gradle自带的依赖报告排查
Gradle的dependencies任务能输出所有依赖的传递关系,帮你找到藏在compile classpath里的注解处理器。执行命令:
# Mac/Linux ./gradlew dependencies --configuration compile # Windows gradlew.bat dependencies --configuration compile
在输出结果里,重点找两类依赖:
- 模块名里带
processor或annotation-processor的(比如dagger-compiler、butterknife-compiler) - 包含
META-INF/services/javax.annotation.processing.Processor配置文件的Jar包(这类就是标准的注解处理器)
2. 借助IntelliJ的inspectCode任务自动检测
如果你的项目用了IntelliJ的Gradle插件,inspectCode任务会直接帮你标记这类问题:
./gradlew inspectCode
执行完成后,去build/reports/inspectCode目录打开HTML报告,搜索“Annotation processor on compile classpath”,里面会直接列出违规的依赖,连位置都给你标好。
3. 自定义Gradle任务批量扫描
要是项目依赖太多,手动看报告效率太低,写个简单的Gradle任务让它自动帮你扫:
task findAnnotationProcessors { doLast { configurations.compile.each { file -> if (file.name.endsWith('.jar')) { def zipFile = new java.util.zip.ZipFile(file) // 检查Jar包是否包含注解处理器的配置文件 def hasProcessor = zipFile.entries().any { entry -> entry.name == 'META-INF/services/javax.annotation.processing.Processor' } if (hasProcessor) { println "⚠️ 找到注解处理器依赖:${file.name}" } zipFile.close() } } } }
把这段代码加到你的build.gradle里,然后执行:
./gradlew findAnnotationProcessors
它会自动遍历compile classpath里的所有Jar包,找出带注解处理器的依赖并打印出来,省心又高效。
4. 直接检查依赖配置的模块名
很多注解处理器的模块命名很规范,比如com.google.dagger:dagger-compiler、com.jakewharton:butterknife-compiler,你可以直接在build.gradle里搜这类模块,看看是不是不小心把它们加到了compile配置里,而不是annotationProcessor配置。
找到后怎么修复?
把违规的依赖从compile移到annotationProcessor配置就行,比如:
// 原来的错误写法 compile 'com.google.dagger:dagger-compiler:2.44.2' // 改成正确的写法 annotationProcessor 'com.google.dagger:dagger-compiler:2.44.2'
这样就能彻底消除那个警告,还能为后续升级到Gradle 5.0做好准备~
内容的提问来源于stack exchange,提问作者José Andias

