`
zhangym124
  • 浏览: 339394 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

本地开发环境下的一例Jar包冲突解决过程记录

阅读更多

 

转载请注明出处: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工程中的同名类。见下图:

 

PS: 查看class真实归属的jar包位置

getClass().getClassLoader().getResource(getClass().getName().replace('.', '/') + ".class")

 

转载请注明出处:http://xuantan.iteye.com/blog/1929727

1
6
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics