debug一段代码抛出异常:
java.lang.reflect.InvocationTargetException
原因是:
Caused by: java.lang.NoSuchMethodError: org.apache.thrift.transport.TFramedTransport.<init>(Lorg/apache/thrift/transport/TTransport;I)V
at com.taobao.timetunnel.thrift.router.RouterService$getAllPubBroker_args.write(RouterService.java:2508)at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:63)
定位原因可是参数出错或者包引用有问题。然后就开始排查日志里面提到的类,发现这个类在项目里面有两个同名的,但方法名不一样,基本可以知道应该是这个问题引起的。现在就是找是两个类所在包怎么引入的。查pom.xml没有直接类的包名,然后使用mvn的命令;
打印出所在jar包的树信息,找到间接引用的包信息:
mvn dependency:resolve 打印出已解决依赖的列表
mvn dependency:tree 打印整个依赖树
mvn dependency:analyze 打印出么有直接依赖的列表
(如果依赖关系比较多,屏幕看不完整,可以使用 -Doutput=/path/to/file.graphml -DoutputType=graphml,文件路径一定要写,否则默认会把文件生成到项目pom文件的地址位置,如果有多个pom文件,就会有多分对应的文件。)
[INFO] | +- com.alibaba.external:google.zxing:jar:1.3:compile
[INFO] | +- com.alibaba.external:nosql.cassandra.hector:jar:0.5.1.9:compile
[INFO] | | +- com.alibaba.external:nosql.cassandra:jar:0.5.1:compile
[INFO] | | | +- com.alibaba.external:google.clhm:jar:1.0:compile
[INFO] | | | +- com.alibaba.external:sourceforge.flexjson:jar:1.7:compile
[INFO] | | | +- com.alibaba.external:sourceforge.high-scale-lib:jar:1.0:c
le
[INFO] | | | +- com.alibaba.external:sourceforge.jline:jar:0.9.94:compile
[INFO] | | | \- com.alibaba.external:org.perf4j:jar:0.9.12:compile
[INFO] | | \- com.alibaba.external:apache.thrift:jar:r820831:compile
查看下代码,不需要被引入的包并没有被调用,所以这次解决比较简单,只需要pom里面设置不关联的包不引入即可。
然后在pom文件里面使用隔开:
<dependency>
<groupId>com.alibaba.external</groupId>
<artifactId>nosql.cassandra.hector</artifactId>
<version>0.5.1.9</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.external</groupId>
<artifactId>apache.thrift</artifactId>
</exclusion>
</exclusions>
</dependency>
再查下项目依赖树,现在的信息为:
| | +- com.alibaba.external:nosql.cassandra.hector:jar:0.5.1.9:compile
| | | \- com.alibaba.external:nosql.cassandra:jar:0.5.1:compile
| | | +- com.alibaba.external:google.clhm:jar:1.0:compile
| | | +- com.alibaba.external:sourceforge.flexjson:jar:1.7:compile
| | | +- com.alibaba.external:sourceforge.high-scale-lib:jar:1.0:compile
| | | +- com.alibaba.external:sourceforge.jline:jar:0.9.94:compile
| | | \- com.alibaba.external:org.perf4j:jar:0.9.12:compile
| | +- com.alibaba.crm.shared:eai:jar:1.0:compile
引起混乱的那个类包已经没有了。
PS:apache的dependency的指令参考http://maven.apache.org/plugins/maven-dependency-plugin/usage.html