JDK,全称Java DevelopmentKit,它提供了Java的开发环境和运行环境,主要用于开发JAVA程序,面向Java程序的开发者,类似面向开发人员使用的SDK。SDK是Software Development Kit一般指软件开发包,可以包括函数库、编译程序等。
JRE,全称Java RuntimeEnviroment,它是指Java的运行环境,是面向Java程序的使用者,而不是开发者。
JVM,全称Java Virtual Machine,JVM就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
安装JDK时,如果选择安装独立的jre,这时候Java目录下就会出现两套非常相似jre,比如:D:\Java\jdk1.8.0_40\jre和D:\Java\jre1.8.0_40(即独立的jre)。存在两套jre的原因是:JDK里面的工具也是用JAVA编写的,它们本身运行的时候也需要一套JRE,即D:\Java\jdk1.8.0_40\jre。而D:\Java\jre1.8.0_40目录下的JRE是用来执行我们自己编写(或外部安装)的JAVA程序。当然,两套JRE中的任何一套都可以用来执行我们自己编写的JAVA程序,但是JDK里面的工具一般只会由D:\Java\jdk1.8.0_40目录下的jre来执行。(这个个人猜测应该和java.exe的寻找jre目录的顺序有关系,java.exe的查找jre的目录的顺序下面会介绍)。
系统存在多套jre时,那么由谁来决定使用哪一套jre呢?这个重担就落在java.exe的身上。
比如如果在命令行中输入java xxx的时候,java.exe的任务就是在我们电脑系统中众多的jre中找到合适的jre来执行xxx。java.exe依据以下顺序来寻找jre:
(1)自己的目录下有没有jre目录;
(2)父目录下有没有jre目录;(D:\Java\jdk1.8.0_40\bin中的java.exe执行时只会使用D:\Java\jdk1.8.0_40\jre的jre,就是出于这个原因);
(3)查询注册表HKEY_LOCAL_MACHINE\Software\JavaSoft\JavaRuntime Environment\。
所以java.exe的执行结果与我们电脑里哪一个java.exe(搜索一下就会发现我们电脑里面也不止一个java.exe)被执行以及哪套jre来执行JVA程序有很大的关系。
另外,java.exe在找到合适的jre以后,还有一个验证版本的程序,也就是java.exe与jre的版本一致才可以执行。如果出现版本不一致的问题,一定要记得两件事情:
(1)哪一个java.exe被执行;
(2)java.exe找到哪一套jre。
只要这两件事情确定了,我们就抓住了问题的来龙去脉,理解起来也就轻而易举了。
在cmd中输入where+空格+java,如果系统环境变量path中存在,就会输出相应的路径。
我们跟踪这个程序文件,发现它是一个快捷方式,如下图:
进而跟踪具体路径,如下:
通过这个我们也能验证D:\Java\jre1.8.0_40这个jre主要是为外部JAVA程序服务的(此时还没有配置JDK的环境变量)。
配置分为2个部分,1,java命令路径。2,java加载类。
1、先配置JAVA_HOME,这个主要是为方便以后需要配置其他程序的java路径。比如JAVA_HOME配置为:D:\Java\jdk1.8.0_40。
2、配置java命令。比如如何知道java和javac的位置;配置如下:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin。这个不知道为什么配置jre\bin。
3、配置加载类的路径。CLASSPATH为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar。注意不要忘了当前路径“.”,因为程序运行时不止需要系统类,同时也会加载自己写的类。
参考网址:
http://blog.sina.com.cn/s/blog_7ffb8dd501011sgc.html
http://www.cnblogs.com/myitm/archive/2011/05/03/2035942.html
http://www.cnblogs.com/pxue/archive/2011/05/10/2042530.html