Java版本兼容问题

Java代码编写完成后,通常要经过编译,编译后产生jar再运行。随着Java版本的升级,编译工具与运行环境都有一定的升级,不过官方称这些都是向下兼容的。

如何理解向下兼容?
向下兼容说的意思是当前版本以及其下所有版本编译的项目都可在当前版本对应的JRE下运行;与其相反是,如果编译版本超越当前JRE版本,则将无法运行,会报错如:Unsupported major.minor version 52.0。这就所谓的高版本的JRE照顾下低版本的编译产出,而高版本的编译产出,低版本的JRE是无法照顾到的。由此我们可以推断运行环境JRE版本必须大于或等于目标编译版本。

但这是否意味着如果我们用高版本JDK来编译代码,就一定不能在低版本环境中运行?答案是并不一定。

首先,我们要知道高版本的JDK总是可以提供很多兼容解决方案,上面说的运行环境JRE版本必须大于或等于目标编译版本是没错的,但是高版本的JDK也可根据你设定的编译等级来照顾到低版本JRE。这就代表高版本latest始终是可以照顾到低版本,因为它是后来者,前面发生的事情它都知道,所以它知道如何解决,在这里你体会到了吗?
JDK设定不同编译等级,这会体现到在class字节码文件头标识编译版本,这样也使得软件开发商可以控制部署环境应该使用的最低运行环境。
通常来说稳定的高版本JDK值得你安装,在生产环境它可以尽量兼容很多应用。

在实际开发中,我们或许还会有一个疑惑,比如我用jdk8开发环境,但是我也没用到jdk8提供的新接口以及它的lambda表达式等特性,按理说我编译后的产物也应该有理由可以在java7上运行,但是实际不可以,这到底怎么回事?

因为上面说了你用java8来编译,字节码文件头已标识了它的具体版本,JVM会遵从一个固定原则,不运行高于自己版本的字节码。其实这就是一个规则而已,没必要疑惑了,因为官方认为你用java8去编译,你就可能会用到高版本的API,如果随意让你在低版本上运行,早晚会出现crash,还不如早点把这个规则给透明化,让大家遵守即可。更何况上面也提到了,这种情况,你既然不会用java8的相关特性,又想在jre7中运行,那你就直接把编译等级参数改成1.7不就可以了?
这其中涉及JDK编译相关工具版本,以及运行jar的JRE环境版本。

说了这么多,不知道大家有没有清楚。当然如果大家还是有点懵懂,再教一招。比如实际解决这种兼容问题的时候,我们的项目充斥着各种jar包,它们要求的最低JDK等级,有的是6,有的是7,有的是8,那么我该选择哪个JRE运行环境呢?好吧记住上面一句话:高版本总是会照顾低版本的,所以不要想那么多了,用JRE8吧。

以上也我个人日常工作经验的一个总结,也许有说的不对不到位的地方,欢迎批评指正。

你可能感兴趣的:(java)