commons-collection从3.2升级到4.4出现Predicate类找不到错误如何解决?
commons-collections从3.x升级到4.x时,官方做了不兼容的包名变更:所有类的包路径从org.apache.commons.collections改为org.apache.commons.collections4,两个版本属于完全独立的依赖,不存在类覆盖。
而你使用的commons-configuration 1.6属于老旧版本,编译时依赖的是commons-collections 3.x的API,运行时会主动加载旧包名的org.apache.commons.collections.Predicate类,你只引入4.4版本的情况下自然找不到对应类,触发类NotFound异常。
这里提供3种可落地的方案,可根据项目实际情况选择:
- 方案1:同时引入commons-collections 3.x和4.x依赖(最推荐,改造成本最低)
两个版本包名完全独立,不会出现类冲突问题,不需要修改任何现有业务代码。注意要把3.x版本升到3.2.2及以上,修复旧版本存在的反序列化安全漏洞。
Maven依赖配置示例:
<!-- 兼容commons-configuration 1.6的旧版本依赖 --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version> </dependency> <!-- 项目需要的4.4版本依赖 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency>
如果是Gradle项目,对应添加两个版本的依赖即可。
方案2:升级commons-configuration到2.x版本
commons-configuration 2.x版本已经完成了对commons-collections4的适配,不再依赖旧版collections的API。但注意2.x版本和1.x的API存在不兼容变更,你现有使用XMLConfiguration的代码需要对应调整:- 包名从
org.apache.commons.configuration.XMLConfiguration改为org.apache.commons.configuration2.XMLConfiguration - 分隔符解析开关等配置项的设置方法有调整,需要适配修改对应代码。
- 包名从
方案3:重打包commons-collections4(不推荐,仅用于无法引入两个版本依赖的特殊场景)
使用maven-shade-plugin等打包插件,把commons-collections4的所有类重定向到旧版org.apache.commons.collections包路径下,可间接满足commons-configuration1.6的调用要求,但是配置复杂,后续版本维护成本高,非必要不选择。
内容的提问来源于stack exchange,提问作者Gun

