一、SDK、JDK、JRE和JVM的关系
SDK(Software Develop Kit,软件开发工具包),用于帮助开发人员的提高工作效率。各种不同类型的软件开发,都可以有自己的SDK。Windows有Windows SDK,DirectX 有 DirectX 9 SDK,.NET开发也有Microsoft .NET Framework SDK。JAVA开发也不含糊,也有自己的Java SDK。
Java SDK最早叫Java Software Develop Kit,后来改名为JDK,即Java Develop Kit。
JDK作为Java开发工具包,主要用于构建在Java平台上运行的应用程序、Applet 和组件等。 JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具和Java基础的类库(rt.jar)。
JRE(Java Runtime Environment), Java运行环境 。 所有的Java程序都要在JRE下才能运行。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。
JVM(Java Virtual Machine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机 ,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。
下图清晰地展示了JDK(Java SDK)、JRE和JVM之间的关系:
可进一步了解 JDK和JRE目录的文件结构
二、为什么安装JDK后可能会出现两套相同的JRE?
jdk安装目录下会有一套JRE。
另一套JRE:C:\Program Files\Java\jre6(用户选择的安装目录)---安装jdk后可以选择安装jre
根本原因就是:jdk提供了很多开发工具,本身就是用java编写的,运行这些工具的时候,就需要jre。
很容易证明这点:
JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe等),而且都放置在 <JDK安装目录>\lib\tools.jar 里。
① 命令行执行javac命令,可以看到输出javac命令提示
② 重命名jdk安装目录下的\lib\tools.jar为tools1.jar,然后执行javac,就会报错java.lang.ClassNotFoundException。
③ 执行java -classpath ..\lib\tools1.jar com.sun.tools.javac.Main 又正确了。
本质上javac.exe只是一个包装器(wrapper),底层调的是com.sun.tools.javac.Main,目的是为了让开发者免於输入太长的指令。既然com.sun.tools.javac.Main是用java编写的,那么运行时就需要jre。
三、如果一台电脑在安装JDK后有两套以上的JRE,谁来决定使用哪套JRE呢?
这个重大任务就落在java.exe身上。Java.exe的工作就是找到合适的JRE来运行Java程序。
执行java.exe时,一定要记得两件事:
1. 那一个java.exe被执行:先搜索当前目录,然后搜索path指定的目录。
2. java.exe找到哪一套JRE搜索顺序如下:
① 自己的目录下有没有jre目录。
② 父目录底下jre子目录。
③ 查询Windows:Registry( HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\ )。
[参考]
SDK、JDK、JRE和JVM的关系总结: http://javaeyes.iteye.com/blog/30667