Java 21下使用Apache Avro SpecificCompilerTool生成类的依赖问题
解决方案
1. 强制统一commons-compress版本
Gradle依赖解析可能存在版本冲突,Avro自带的commons-compress版本大概率与Java21不兼容,直接强制指定兼容Java21的高版本(如1.26.0):
configurations.all { resolutionStrategy.force 'org.apache.commons:commons-compress:1.26.0' }
2. 升级Avro并排除冲突依赖
Avro 1.12.x及以上版本原生支持Java21,升级到该版本并排除Avro自带的commons-compress依赖,彻底避免版本冲突:
dependencies { // 用于编译生成的Avro类 implementation('org.apache.avro:avro:1.12.0') { exclude group: 'org.apache.commons', module: 'commons-compress' } // 用于运行SpecificCompilerTool的工具依赖 implementation('org.apache.avro:avro-tools:1.12.0') { exclude group: 'org.apache.commons', module: 'commons-compress' } // 手动添加兼容Java21的commons-compress版本 implementation 'org.apache.commons:commons-compress:1.26.0' }
3. 确保自定义生成任务的ClassPath正确
如果是通过自定义Gradle任务执行SpecificCompilerTool,必须保证任务的classpath包含所有必要依赖:
task generateAvroClasses(type: JavaExec) { mainClass = 'com.yourpackage.YourSpecificCompilerToolImpl' // 绑定到主源码集的运行时classpath,确保依赖都能被加载 classpath = sourceSets.main.runtimeClasspath // 根据你的需求传递参数,比如schema目录、输出目录 args = ['src/main/resources/avro', 'src/main/java'] } // 让编译Java代码前先执行Avro类生成任务 compileJava.dependsOn generateAvroClasses
4. 彻底清理并重新构建
执行以下命令清空缓存并重新构建,确保依赖配置完全生效:
./gradlew clean build --refresh-dependencies
内容的提问来源于stack exchange,提问作者Dishant
相关产品推荐
相关产品推荐

