Gradle 8升级后插件发布报类型转换错误求助
问题场景
将Gradle从7.x升级到8.x后,执行插件发布时触发以下类型转换错误:
class org.gradle.api.internal.provider.DefaultSetProperty cannot be cast to class java.util.Collection (
org.gradle.api.internal.provider.DefaultSetProperty位于org.gradle.internal.classloader.VisitableURLClassLoader @66cd51c3的未命名模块中;
java.util.Collection位于引导加载器的java.base模块中
)
已按照官方文档完成配置迁移:移除原pluginBundle块,将配置迁移至gradlePlugin块,但错误仍存在。当前依赖版本:
- Kotlin:1.8.10
- Java:17
- Gradle:8.0.2
- com.gradle.plugin-publish:1.0.0
- io.github.gradle-nexus.publish-plugin:1.1.0
解决方案
1. 升级com.gradle.plugin-publish插件版本
错误的核心原因是**com.gradle.plugin-publish:1.0.0与Gradle 8.x不兼容**。旧版本插件内部直接将SetProperty视为Collection的子类进行操作,但Gradle 8.x对Property系列类型的实现做了调整,DefaultSetProperty不再直接实现Collection接口,导致类型转换失败。
将插件版本升级至1.1.0及以上(推荐使用最新稳定版,如1.2.0):
plugins { id("com.gradle.plugin-publish") version "1.2.0" // 其他插件配置... }
2. 验证gradlePlugin块配置正确性
确认tags的设置方式符合Gradle 8.x的规范:
gradlePlugin { website.set("你的插件官网地址") vcsUrl.set("你的代码仓库地址") plugins { create("插件ID") { id = project.group.toString() displayName = project.name description = project.description.toString() implementationClass = "你的插件实现类全限定名" tags.set(setOf("标签1", "标签2")) // 传入Set类型,匹配SetProperty的要求 } } }
3. 可选:升级nexus发布插件(如遇连带问题)
如果升级plugin-publish后仍有其他兼容性问题,可将io.github.gradle-nexus.publish-plugin升级至最新稳定版(如1.3.0):
plugins { id("io.github.gradle-nexus.publish-plugin") version "1.3.0" // 其他插件配置... }
验证
完成版本升级后,重新执行发布命令(如publishPlugins),即可解决类型转换错误。
内容的提问来源于stack exchange,提问作者u-ways

