JAVA兼容低版本JDK的正确编译方式

Wesley13
• 阅读 733

虽然使用高版本的JDK可以通过指定编译source和target参数来兼容低版本JDK,但只是class文件格式上的,如果引用了高版本JRE库中某些方法一样会再低版本的JDK上报错;典型的例子就是java.util.concurrent.ConcurrentHashMap.keySet()这个方法!

import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

public class T {

    public static void main(String[] args) {
        ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();
        map.put("hello", "");
        Iterator<String> it = map.keySet().iterator();
        System.out.println(it.next());
        
    }

}

用jdk1.8编译 /jdk1.8/bin/javac -source 1.7 -target 1.7 T.java

用jdk1.7执行 /jdk1.7/bin/java T

会报异常 java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView

解决的办法是,编译使用对应的JDK,确保JRE的类库是对应版本。否则在意想不到的地方出现坑!

参考:http://stackoverflow.com/a/25705596

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
待兔 待兔
3年前
Java8 几个很好用的方法,真的很香
JDK8应该是Java中最坚挺一个版本,这个版本新增很多特性,让我们开发起来多了很多便利。不过最近Review项目代码的时候发现,虽然很多项目工程已经使用了JDK8,但是工程代码却很少使用到JDK8新特性、新方法。如果单从代码正确性上来说,老方式写法写当然没有什么问题,那唯一的缺点其实就是代码行数比较多,比较繁琐。那同样的需求,使
待兔 待兔
3年前
Java中遍历HashMap的5种方式
本教程将为你展示Java中HashMap的几种典型遍历方式。如果你使用Java8,由于该版本JDK支持lambda表达式,可以采用第5种方式来遍历。如果你想使用泛型,可以参考方法3。如果你使用旧版JDK不支持泛型可以参考方法4。1、通过ForEach循环进行遍历importjava.io.IOException;importjav
Wesley13 Wesley13
2年前
Struts2 下载取消报异常最终解决办法 1.2 版本
兼容性1.兼容struts2sunspoterstream1.0.jar版本2.JDK最低版本1.53.源码在GITHUB中提供,https://github.com/41zone/StreamResultX(https://www.oschina.net/action/GoToLink?urlht
Wesley13 Wesley13
2年前
Mac下配置Java开发环境以Java 8 为例
前言:最近GoogleAndroid的SDK中一些高版本的API(18)需要在JDK1.7下才能编译。但是MACOSX系统默认安装的是JDK1.6所以需要我们自己安装需要的JDK版本。下面以Java8的安装和配置为例。Step1:下载Java安装包系统:MACOSX10.10.1Java8安装包:jdk8u3
Wesley13 Wesley13
2年前
oracle 12c DMP文件导出,oracle 11gDMP文件导入
首先,我们都知道一点,由于版本问题,dmp文件的导出导入会报错,而低版本的导出,高版本是可以直接导入的,它能兼容低版本而高版本导出,想要导入低版本,这个就有问题了,会提示版本的兼容问题,别人的解决方法我不知道,当然我也尝试过了,但是在我这里没有成功。所以我尝试了一下逼得办法,也就是在12c导出的语句最后要加上一句版本号,先将版本号转换为11g的:高版
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Titanium Studio安装和设置
1、下载并安装JDK(官网下载即可,需要32位版本的JDK,特别注意选择JDK1.7.X版本即JDK7版本,8以上的版本运行AndroidAVD会报错,但也可以先安装最新的JDK然后根据具体结果后再做选择)2、配置JDK环境变量:新建系统变量JAVA\_HOME和CLASS\_PATH,添加path路径JAVA\_HOME值为 C:\\Progr