java导入外部项目后,编译后的class文件和执行的JDK版本不一致问题解决

1. java编译及运行过程

 Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程。      

首先两张图,描述编译和执行的过程:

Java代码编译是由Java源码编译器来完成,流程图如下所示:

java导入外部项目后,编译后的class文件和执行的JDK版本不一致问题解决

Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:

java导入外部项目后,编译后的class文件和执行的JDK版本不一致问题解决


          Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode)  2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-interpreted" language)。


Java语言提供的编译器不针对特定的操作系统和CPU芯片进行编程,而是针对Java虚拟机把Java源程序编译成称为字节码的“中间代码”,然后Java虚拟机负责将字节码翻译成虚拟机所在平台的机器码,并让当前平台运行该机器码。 
Java语言的运行原理: 
在一个计算机上编译得到的字节码文件(就是.class文件),可以复制到任何一个安装了Java运行环境的计算机上直接运行。然后字节码文件由虚拟机负责解释执行,即Java虚拟机将字节码翻译成本地计算机的机器码,然后将机器码交给本地的操作系统运行。

由于在一个计算机上编译得到的字节码文件可以复制到任何一个安装了Java运行环境的计算机上直接使用,所以字节码其实是一种“中间代码”,这也就是为什么“Java语言能够一次编译,处处运行,也就是Java跨平台的原因。”所以称Java是一种“半编译,半解释的语言”,即源程序——>编译——>字节码——>字节码解释程序——>对应平台的机器语言。”

2. java的跨平台特性

Java语言提供的编译器不针对特定的操作系统和CPU芯片进行编程,而是针对Java虚拟机把Java源程序编译成称为字节码的“中间代码”,然后Java虚拟机负责将字节码翻译成虚拟机所在平台的机器码,并让当前平台运行该机器码。 
Java语言的运行原理: 
在一个计算机上编译得到的字节码文件(就是.class文件),可以复制到任何一个安装了Java运行环境的计算机上直接运行。然后字节码文件由虚拟机负责解释执行,即Java虚拟机将字节码翻译成本地计算机的机器码,然后将机器码交给本地的操作系统运行。


由于在一个计算机上编译得到的字节码文件可以复制到任何一个安装了Java运行环境的计算机上直接使用,所以字节码其实是一种“中间代码”,这也就是为什么“Java语言能够一次编译,处处运行,也就是Java跨平台的原因。”所以称Java是一种“半编译,半解释的语言”,即源程序——>编译——>字节码——>字节码解释程序——>对应平台的机器语言。”


3.  不同的jre编译器产生不同版本的class文件

不同的jre编译器产生不同版本的 class文件,因此有时从外部导入的项目中已经包含了由其他版本jre编译产生的class文件,这与本地的jdk版本不一致,故会报错“java.lang.UnsupportedClassVersionError”。

solution:对项目的源文件(.java)重新通过现有的jre进行编译,产生于现在虚拟机版本一致的class文件;

操作如下:

 解决的办法:
    打开exclipse中项目上的属性—java compiler–选择一个合适的版本后重新编译即可。具体:

        解决:项目------>右键------>属性------>Java Compiler------>Enable project specific settings------>Compiler Compliance LEVEL------>选择你使用的JDK版本------>应用。

然后Ctrl + S,eclipse即会自动按照新的complier设置生成新的.class文件

结果:实测解决问题,bin中的.class文件全部变成了今天的