添加storm-hive依赖后Maven编译失败问题排查
1. 为什么最初编译没有错误?
你第一次编译成功是因为项目的依赖环境完全稳定:
- 你明确声明的
commons-lang3:3.3.2在本地仓库存在,其中包含unescapeJson方法,代码调用完全匹配 - 项目中JSON相关的依赖版本统一,相关方法抛出的异常不需要显式捕获/声明(比如当时依赖的JSON库版本中,对应方法抛出的是未检查异常,或者你的代码已经隐式兼容)
添加storm-hive依赖后,Maven的依赖传递机制引入了冲突的依赖版本,直接破坏了原有的依赖环境,才触发了这些编译错误。
2. 依赖功能失效的原因与修复方案
核心问题根源
storm-hive:1.1.1本身依赖了更高版本的commons-lang3(你可以执行mvn dependency:tree命令查看具体版本,大概率是3.4及以上),Maven的依赖调解机制会优先选择路径更短或声明更晚的依赖版本,这就导致你的项目实际使用的commons-lang3被替换成了更高版本——而unescapeJson方法在3.4及以后的版本中被移除了,所以编译时提示找不到符号。
至于JSONException的错误,同样是依赖传递引入了不同版本的JSON库,新版本的JSON方法可能将原本的未检查异常改为了已检查异常,要求必须显式捕获或声明抛出。
具体修复步骤
排除storm-hive中的冲突依赖
在你的storm-hive依赖声明中,添加排除规则,强制项目继续使用你指定的commons-lang3:3.3.2:<dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-hive</artifactId> <version>1.1.1</version> <!-- 排除冲突的commons-lang3版本 --> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </exclusion> </exclusions> </dependency>验证依赖环境
执行mvn dependency:tree命令,确认输出中commons-lang3的版本只有3.3.2,没有其他版本的引入。处理JSONException(按需操作)
如果排除冲突后仍然有JSONException错误,说明storm-hive还引入了冲突的JSON库,同样用排除规则移除它;或者检查项目中原本的JSON依赖版本,确保依赖统一。如果是代码层面需要处理异常,就按照编译提示,在对应的方法上添加throws org.json.JSONException,或者在调用处用try-catch捕获。重新编译
执行mvn clean compile,应该就能正常通过编译了。
内容的提问来源于stack exchange,提问作者Albatross

