?
转载请注明出处:http://xuantan.iteye.com/blog/1929727
?
?
环境:本地开发环境,windows7+Eclipse+HSF Jetty(HSF Jetty作为启动容器)
Defensor在进行增量覆盖率功能开发时,出现了一个诡异的问题————代码运行阶段,对一个类中的方法进行调用,报如下错误信息:
1、正常情况应该调用tcc-emma-3.2.0.jar(对应本地tcc-emma工程)中的reportCommand类,此类中确实存在getProjectCoverageFromThread()方法
2、那为什么会报找不到此方法?第一感觉,Jar包冲突了。
3、在调用处的上方添加如下语句
reportCommand.class.getProtectionDomain().getCodeSource();
注:此行代码含义为————真实加载的具体类的路径信息。
执行到上面的代码,通过eclipse的Inspect可以看到:
真实加载的类路径为:
D:\.m2\repository\com\taobao\test\tcc-maven-plugin\1.0.8-SNAPSHOT\tcc-maven-plugin-1.0.8-SNAPSHOT.jar
4、目前为止,已经分析出确实是Jar包冲突问题导致运行时加载了错误的类。但是这个错误的jar包是在父工程pom依赖进来,且pom中的配置为scope=test,也就是说只有在构建工程的测试阶段才会加载此jar包,而在工程提供服务的运行阶段是不会加载此Jar的。并且通过查看最终编译打出的war包,确实也没有此jar。
5、为什么会在运行期间加载了scope=test的Jar包里的类呢?分析到这里,聪明的读者应该会想到是Eclipse的问题所导致,它将测试阶段引用到的jar包也加入进了运行期class path中,而且加载的优先级高于tcc-emma工程中的同名类。
6、尝试了多种方法,均无法将tcc-maven-plugin-1.0.8-SNAPSHOT.jar从加载过程中移除。最终,通过调整Eclipse中的Build class path顺序解决了这个问题,也就是明确告诉容器启动时优先加载tcc-emma工程中的同名类。见下图:
?
?
?
转载请注明出处:http://xuantan.iteye.com/blog/1929727