使用公司的一个jar包时, 启动tomcat发现一个很奇怪的错误,
java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()
Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
NoSuchMethodError这种错误基本属于jar包版本问题.
查看jar包的class文件:
![](https://img.haomeiwen.com/i1324594/033c3c74e5ceb51d.png)
![](https://img.haomeiwen.com/i1324594/eb4830ff07142a1d.png)
可以看到major版本是50(jdk1.6), 但是确实出现了jdk1.8中的内部类ConcurrentHashMap$KeySetView. 应该是作者使用jdk1.8编译了jar包, 使用了参数target1.6
下载源码用jdk1.7重新编译.
![](https://img.haomeiwen.com/i1324594/4649fc6d05d9ebd1.png)
keySet()的返回值变成了java.util.Set.
此处要注意javac -target 参数只保证指定版本的jdk能否加载class文件(把major版本号编译成对应版本)但并不保证运行期一定正确.
网友评论