Jre 是java runtime environment, 是java程序的运行环境。既然是运行,当然
要包含jvm,也就是大家熟悉的虚拟机, 还有所有java类库的class文件,都在lib目
录下打包成了jar。大家可以自己验证。至于在windows上的虚拟机是哪个文件呢? 学过
MFC的都知道什么是dll文件吧。那么大家看看
jre/bin/client里面是不是有一个jvm.dll呢?那就是虚拟机。
Jdk 是java development kit,是java的开发工具包,里面包含了各种类库和工具
。当然也包括了另外一个Jre. 那么为什么要包括另外一个Jre呢?而且jdk/jre/bin同
时有client和server两个文件夹下都包含一个jvm.dll。 说明是有两个虚拟机的。这一
点不知道大家是否注意到了呢?
相信大家都知道jdk的bin下有各种java程序需要用到的命令,与jre的bin目录最明显的区
别就是jdk下才有javac,这一点很好理解,因为jre只是一个运行环境而已。与开发无关,
正因为如此,具备开发功能的jdk自己的jre下才会同时有client性质的jvm和server性质的
jvm, 而仅仅作为运行环境的jre下只需要client性质的jvm.dll就够了。
记得在环境变量path中设置jdk/bin路径?这应该是大家学习Java的第一步吧, 老师
会告诉大家不设置的话javac和java是用不了的。确实jdk/bin目录下包含了所有的命令。
可是有没有人想过我们用的java命令并不是jdk/bin目录下的而是jre/bin目录下的呢?不
信可以做一个实验,大家可以把jdk/bin目录下的java.exe剪切到别的地方再运行java程序
,发现了什么?一切OK!
那么有人会问了?我明明没有设置jre/bin目录到环境变量中啊?
试想一下如果java为了提供给大多数人使用,他们是不需要jdk做开发的,只需要jre能让
java程序跑起来就可以了,那么每个客户还需要手动去设置环境变量多麻烦啊?所以安装
jre的时候安装程序自动帮你把jre的java.exe添加到了系统变量中,验证的方法很简单,
大家看到了系统环境变量的path最前面有“%SystemRoot%system32;%SystemRoot%;”这样
的配置,那么再去Windows/system32下面去看看吧,发现了什么?有一个java.exe。
补充:
jdk(java development kit),就是java的开发工具集,顾名思义就是你做开发用的,其中包括javac,也就是java compiler等。
jre(java runtime environment),就是java程序的运行环境。你所写的java程序在经过javac编译后会形成字符行文件,这个java的中间文件,计算机是看不懂的,而这个文件是给jvm(java的虚拟机)用的,由jvm进行解释后形成机器语言给计算机。而这个jvm就在jre中,也就是说java程序的运行要有jre来担当。
所以jdk和jre的区别就是一个用于开发,一个用于运行,联系就是他们都是java开发者所必备的(除非你就像运行java程序,那么用jre就足够了)。
---------------------------------------------
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。编译虚拟机的指令集与编译微处理器的指令集非常类似。
JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。它是运行、测试和传输应用程序的Java平台。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具--编译器、调试器和其它工具。JRE需要辅助软件--JavaPlug-in--以便在浏览器中运行applet。
JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。