引入共享传递依赖的第三方库后Cassandra驱动报ClassNotFoundException
问题原因
虽然mvn dependency:tree显示com.typesafe:config版本一致,但该异常的核心原因是引入new-library后,实际加载到运行环境的com.typesafe:config包不完整:要么是new-library打包时篡改了传递的config包(删除了部分类、重打包修改了类路径、或错误标记了依赖scope),要么是本地Maven仓库的config包缓存损坏。
解决方案
按以下优先级操作即可解决:
校验并修复本地Maven缓存
进入本地Maven仓库的com/typesafe/config/1.4.1目录,删除该目录下所有文件,执行mvn clean install -U重新拉取官方正式包,解压新拉取的config-1.4.1.jar确认存在com/typesafe/config/ConfigOriginFactory.class文件。全局锁定依赖版本
在项目pom.xml的dependencyManagement节点下添加全局锁定配置,优先级高于所有传递依赖:<dependencyManagement> <dependencies> <dependency> <groupId>com.typesafe</groupId> <artifactId>config</artifactId> <version>1.4.1</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>同时保留
new-library依赖下的com.typesafe:config排除规则,确保使用全局锁定的官方包。清理构建验证
执行以下命令完全清理旧构建产物后重新打包:mvn clean package解压最终生成的SpringBoot jar包,检查
BOOT-INF/lib下的config-1.4.1.jar是官方完整包即可。极端情况处理
如果以上操作仍无效,说明new-library内部直接内嵌了重打包的config类(未通过传递依赖引入),此时可修改spring-boot-maven-plugin配置,调整类加载顺序优先加载com.datastax.oss相关依赖,或使用Maven Shade插件将com.typesafe:config包重命名后引入,避免类路径冲突。
内容的提问来源于stack exchange,提问作者Paul C

