从Maven迁移至Gradle后War包部署Tomcat出现依赖错误求助
问题分析与解决方案
针对 NoSuchMethodError: org.apache.commons.lang.StringUtils.capitalize 错误
- 问题本质:项目依赖的是
org.apache.commons:commons-lang3:3.9,但错误提示调用的是旧版commons-lang(包路径org.apache.commons.lang)的capitalize方法。你在hadoop-common依赖中排除了commons-lang,但不排除其他依赖间接引入旧版,或代码里引用了错误的包路径。 - 修复步骤:
- 全局检查代码中
StringUtils.capitalize的导入语句,确保所有引用都是org.apache.commons.lang3.StringUtils,替换旧版的org.apache.commons.lang.StringUtils。 - 执行
gradle dependencies查看依赖树,定位是否有其他依赖引入了旧版commons-lang,如果有,给对应依赖添加排除规则,示例:api('第三方依赖组:依赖名:版本') { exclude group: 'commons-lang', module: 'commons-lang' } - 若确认项目完全不需要旧版
commons-lang,可全局强制排除:configurations.all { exclude group: 'commons-lang', module: 'commons-lang' }
- 全局检查代码中
针对 NoClassDefFoundError: Could not initialize class org.apache.hadoop.security.UserGroupInformation 错误
- 问题本质:
UserGroupInformation初始化失败,大概率是因为缺少Hadoop核心依赖,或者依赖冲突导致类加载异常。你给hadoop-common排除了大量必要依赖(比如commons-codec、httpclient、guava等),这些都是Hadoop初始化必须的组件。 - 修复步骤:
- 调整
hadoop-common的排除规则,恢复核心依赖的引入,示例:api ('org.apache.hadoop:hadoop-common:3.3.6'){ // 保留日志、重复Spring依赖等必要排除,移除以下核心依赖的排除: // exclude group: 'commons-codec', module: 'commons-codec' // exclude group: 'org.apache.httpcomponents', module: 'httpclient' // exclude group: 'org.apache.httpcomponents', module: 'httpcore' // exclude group: 'commons-collections', module: 'commons-collections' // exclude group: 'com.google.guava', module: 'guava' // 其余排除项根据实际冲突情况保留 } - 检查Tomcat服务器
lib目录,若存在与Hadoop依赖冲突的Jar包(比如旧版commons-codec、guava),移除冲突包,保证War包内依赖版本一致。 - 执行
gradle dependencies确认hadoop-common的所有传递依赖都已正确引入,无缺失。
- 调整
额外优化建议
- 清理Gradle缓存并重新构建:执行
gradle clean build --refresh-dependencies,确保依赖重新下载并正确打包。 - 对比Maven与Gradle依赖树:分别用
mvn dependency:tree和gradle dependencies输出依赖树,找出两者的差异,重点排查冲突版本和缺失依赖。
内容的提问来源于stack exchange,提问作者Gaurav
相关产品推荐
相关产品推荐

