在一个项目里发现引用了 JCaptcha 包以后, 执行mvn test
一切正常, 而原有的mvn emma:emma
执行就失败了, 抛出下面的异常:
1 | ------------------------------------------------------------------------------- |
之前一只猜想是不是 JCaptcha 的包有问题, 但是从报错信息上看, 却又好像和 JCaptcha 没有任何关系. 仔细查看日志, 看到最有用的一行:
java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationUtils.findAnnotationDeclaringClass(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Class;
说是AnnotationUtils类中找不到findAnnotationDeclaringClass方法, 但是执行mvn test
的却没有问题, 初步判断, 会不会是由于 spring 版本冲突导致 test 和 emma 执行时使用的不是相同版本的 spring.
接下来去验证这个问题, 通过下面的命令查看项目依赖的各个包的版本:
1 | mvn dependency:tree |
看到下面的结果:
1 | [INFO] com.vipshop:passport_service:war:0.0.1 |
确实看到我们用的org.springframework:spring-core:jar是3.0.5而 jcaptcha 引用的org.springframework:spring:jar是2.0版.
我们需要屏蔽 jcaptcha 中的这个 spring, 让它使用 3.0.5 的依赖, 我们直接修改 pom.xml 中关于 jcaptcha 的 dependency:
1 | <dependency> |
之后再次执行mvn emma:emma
, 已经可以正常跑通了.