高版本编译器编译低版本class文件踩坑

使用公司的一个jar包时, 启动tomcat发现一个很奇怪的错误,

java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet() 
Ljava/util/concurrent/ConcurrentHashMap$KeySetView;

NoSuchMethodError这种错误基本属于jar包版本问题.
查看jar包的class文件:

Paste_Image.png
Paste_Image.png

可以看到major版本是50(jdk1.6), 但是确实出现了jdk1.8中的内部类ConcurrentHashMap$KeySetView. 应该是作者使用jdk1.8编译了jar包, 使用了参数target1.6

下载源码用jdk1.7重新编译.

Paste_Image.png

keySet()的返回值变成了java.util.Set.

此处要注意javac -target 参数只保证指定版本的jdk能否加载class文件(把major版本号编译成对应版本)但并不保证运行期一定正确.

你可能感兴趣的:(高版本编译器编译低版本class文件踩坑)