本地开发环境下的一例Jar包冲突解决过程记录_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 本地开发环境下的一例Jar包冲突解决过程记录

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

 2013/8/23 16:10:08  zhangym124  程序员俱乐部  我要评论(0)
  • 摘要:转载请注明出处:http://xuantan.iteye.com/blog/1929727描述一下具体场景:环境:本地开发环境,windows7+Eclipse+HSFJetty(HSFJetty作为启动容器)Defensor在进行增量覆盖率功能开发时,出现了一个诡异的问题————代码运行阶段,对一个类中的方法进行调用,报如下错误信息:分析&解决过程:1、正常情况应该调用tcc-emma-3.2.0.jar(对应本地tcc-emma工程)中的reportCommand类
  • 标签:解决 开发环境 过程 开发

?

转载请注明出处: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

发表评论
用户名: 匿名