升级Gson至2.9.0后JUnit4调用create()抛出NoSuchMethodError如何解决
问题原因
这是典型的Maven依赖冲突问题,和你写的Gson初始化代码本身没有关系。
你虽然在pom中显式声明了Gson 2.9.0版本,但测试运行时的类路径里存在优先级更高的旧版Gson包:编译阶段用的是2.9.0的类结构(所以编译不报错),运行时类加载器先加载到了旧版本的Gson类,而旧版本里com.google.gson.internal.ConstructorConstructor类不存在你当前调用的构造方法,就抛出了NoSuchMethodError。
排查方法
执行Maven依赖树分析命令,定位是哪个依赖传递引入了低版本Gson:
mvn dependency:tree -Dincludes=com.google.code.gson:gson
命令输出结果里会列出所有引入Gson的依赖路径,你可以直接看到除了你自己声明的2.9.0之外,哪个依赖拉了低版本的Gson进来。
修复方案
二选一即可,多模块项目优先选第二种:
- 方案1:在传递引入低版本Gson的依赖上添加排除规则,示例:
<dependency> <!-- 替换为你排查到的引入低版本gson的依赖坐标 --> <groupId>对应依赖的groupId</groupId> <artifactId>对应依赖的artifactId</artifactId> <version>对应依赖的版本</version> <exclusions> <exclusion> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </exclusion> </exclusions> </dependency>
- 方案2:在项目pom的
dependencyManagement节点中全局锁定Gson版本为2.9.0,强制所有模块、所有传递依赖都使用这个版本的Gson,配置如下:
<dependencyManagement> <dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.9.0</version> </dependency> </dependencies> </dependencyManagement>
验证操作
配置修改完成后,先执行mvn clean清理旧的编译产物,刷新Maven依赖后重新运行JUnit测试用例即可。如果是在Eclipse/IDEA等IDE中运行,记得同步刷新IDE的Maven依赖缓存,避免IDE还引用旧的本地jar包。
内容的提问来源于stack exchange,提问作者Brijesh Tewari
相关产品推荐
相关产品推荐

