发布到jCenter后注解处理器库报NoClassDefFoundError: com/squareup/javapoet/TypeName
这问题我之前开发注解处理器库时也踩过一模一样的坑,本质是你的注解处理器模块(dialogboot-compiler)在发布到jCenter时,没有正确声明它的依赖项,导致使用方的编译环境无法获取到JavaPoet库。本地依赖正常是因为模块间的依赖传递是Android Studio自动处理的,但远程依赖时只能依赖pom文件中明确声明的内容。
核心原因拆解
当你在本地用annotationProcessor project(':dialogboot-compiler')时,Android Studio会自动把dialogboot-compiler模块的所有依赖(包括JavaPoet)都加入到编译时的classpath里。但发布到远程仓库后,如果dialogboot-compiler的pom文件中没有把JavaPoet标记为传递依赖,使用方的annotationProcessor配置就只会拉取dialogboot-compiler本身,找不到JavaPoet的类,自然就抛出NoClassDefFoundError了。
具体解决方案
1. 修改处理器模块的依赖声明
把dialogboot-compiler模块中JavaPoet的依赖从implementation改成api。这样Gradle会自动把JavaPoet作为传递依赖写入pom文件,使用方的annotationProcessor配置会自动拉取这个依赖。
修改dialogboot-compiler的build.gradle(或build.gradle.kts):
// 替换原来的implementation声明 api 'com.squareup:javapoet:1.13.0' // 改成你实际使用的版本号
2. 重新发布到jCenter
修改完成后,重新打包并发布dialogboot-compiler模块到jCenter。记得更新版本号(比如改成1.1.2),避免本地缓存干扰测试结果。
3. 验证pom文件(可选)
发布完成后,可以到jCenter上查看dialogboot-compiler的pom文件,确认里面包含了JavaPoet的依赖项,比如:
<dependency> <groupId>com.squareup</groupId> <artifactId>javapoet</artifactId> <version>1.13.0</version> <scope>compile</scope> </dependency>
4. 测试远程依赖
在你的测试项目中,更新依赖到最新版本:
implementation 'com.masum.dialogboot:dialogboot-annotations:1.1.2' annotationProcessor 'com.masum.dialogboot:dialogboot-compiler:1.1.2'
然后执行Clean Project + Rebuild,应该就能解决这个错误了。如果还是有问题,可以尝试执行./gradlew clean build --refresh-dependencies强制刷新依赖缓存。
内容的提问来源于stack exchange,提问作者Masum

