JRE

Java运行环境(Java Runtime Environment,简称JRE)是一个软件,由太阳微系统所研发,JRE可以让计算机系统运行Java应用程序(Java Application)。

JRE的内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的类别函数库(Class Library)。

JRE为Java Runtime Environment的简称,Java Runtime Environment(包括Java Plug-in)是Sun的产品,包括两部分:Java Runtime Environment和Java Plug-in。JavaRuntimeEnvironment(JRE)是可以在其上运行、测试和传输应用程序的Java平台。它包括Java虚拟机(jvm)、Java核心类库和支持文件。它不包含开发工具(JDK)--编译器、调试器和其它工具。JRE需要辅助软件--Java Plug-in--以便在浏览器中运行applet。

Java Plug-in软件允许Java Applet和JavaBean组件在使用Sun的Java Runtime Environment(JRE)的浏览器中运行,而不是在使用缺省的Java运行环境的浏览器中运行。Java Plug-in可用于Netscape Navigator和Microsoft Internet Explorer。

J2RE是Java2 Runtime Environment,即Java运行环境,只是强调其匹配Java2平台,有时简称JRE。如果你只需要运行Java程序或Applet,下载并安装它即可。如果你要自行开发 Java软件,请下载JDK(JRE和JDK的区别)。在JDK中附带有JRE。

Java的解决办法是每个程序自己携带一套JRE。

比如说某人的机器上已经被安装了好多套JRE和JDK(JDK包括了同版本的JRE,此外还包括有编译器和其它工具),它们分别是:

BEAWeblogic Server 7.0 自带一套 JDK1.3.1_02, 还下载了一套最新的JDK1.4.1_02

JBuilder9自带一套JDK1.4.1_02

Oracle8.1.7自带一套JRE1.1.7

RationRose自带一套JDK1.3

DreamWeaver自带一套JDK1.3

6套JRE,每套JRE都被各自安装到不同的目录,不会互相影响。当在控制台执行java.exe,操作系统寻找JRE的方式如下:

先找当前目录下有没有JRE

再找父目录下有没有JRE

接着在PATH路径中找JRE

注册表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看CurrentVersion的键值指向哪个JRE

最常用的是在PATH路径中找JRE,一般情况下,自己的程序运行之前都会先在批处理文件里面临时设置PATH,把自己用的JRE放到PATH路径最前面,所以肯定会运行自己带的JRE,不会造成版本混乱。

JRE自带的基础类库主要是JRE\lib\rt.jar这个文件,包括了Java2平台标准版的所有类库。和JRE的版本一致。

Net Framekwork的核心类库

Net Framekwork的核心类库被放置在C:\Winnt\assembly\gac\目录下,按照不同的名称空间放在不同目录中,不像JRE打成了一个包。并且可以同时存在不同的版本,例如:

某类库1.0版本 C:\Winnt\assembly\gac\名称\1.0\名称.dll

某类库1.1版本 C:\Winnt\assembly\gac\名称\1.1\名称.dll

这样做,虽然很灵活,可以随时把类库更新到最新的状态,但是很容易带来版本管理的复杂度,造成版本不一致。

JRE中由ClassLoader负责查找和加载程序引用到的类库,基础类库ClassLoader会到rt.jar中自动加载,其它的类库,ClassLoader在环境变量CLASSPATH指定的路径中搜索,按照先来先到的原则,放在CLASSPATH前面的类库先被搜到,Java程序启动之前建议先把PATH和CLASSPATH环境变量设好,OS通过PATH来找JRE,确定基础类库rt.jar的位置,JRE的ClassLoader通过CLASSPATH找其它类库。但有时候会出现这样的情况,希望替换基础类库中的类库,那么也可以简单的通过-Djava.endrosed.path=...参数传递给java.exe,于是ClassLoader会先于基础类库使用java.endrosed.path参数指定路径的类库。因此Java的版本管理是非常简单有效的,也许很原始,不过很好用,简单就不容易出错。(所以我很奇怪Eric Ramond为什么批评Java的类库管理机制,他还居然批评Java的接口,令人怀疑他对Java的了解程度)

Net Framework的类库管理机制 .Net Framework的类库管理机制相当强大和复杂,分为私有类库和共享类库。

私有类库就放在exe程序当前路径下,或其相对路径中,只有当前程序可见。

1、共享类库需要在GAC(Global Assembly Cache)中注册,注册过程比较复杂,首先要用工具生成公开/私有密钥对,然后结合密钥和类库版本号连编,最后使用工具注册到GAC中好以后,会被放在"C:\Winnt\assembly\gac\类库的名称空间\版本号\"目录下,不同的类库版本在注册的时候会按照版本号分开放置:

·某类库1.0版本 C:\Winnt\assembly\gac\名称\1.0\名称.dll

·某类库1.1版本 C:\Winnt\assembly\gac\名称\1.1\名称.dll

2、可以同时存在一个类库的n个版本,至于在程序中用哪个版本,在程序的配置文件中声明,CLR会根据声明来调用相应的版本的类库。我觉得.Net实现方法未免太复杂了一些,将所有共享类库都塞到一个系统目录下,并且同一个类库还有n个版本,将来.Net第三方开发的类库逐渐丰富起来以后,.Net类库的GAC也会越来越庞大,会不会也搞得和Windows注册表一样难以维护?软件发布到服务器上的时候,类库要再注册一次,服务器会逐渐形成一个庞大的树状的GAC,GAC里面存放着组件的n个版本。

全局程序集缓存不会是无限大的,所以“将来.Net第三方开发的类库逐渐丰富起来以后,.Net类库的GAC也会越来越庞大,会不会也搞得和Windows注册表一样难以维护?”这是杞人忧天。原因如下:第一是操作系统的生命周期一般不会是无限长的,而且越来越短,Windows为证,同时.Net Framework也在不断更迭,在十年左右的时间里,全球的程序产量是有限的,高质量的第三方开发的类库更是有限,需要注册到GAC的就更少了。

Java运行时环境与Java平台

尽管Java Runtime Environment是Java平台的一部分,但Java Runtime Environment不应与Java平台合并。原因是,Java平台是一般的东西,但Java Runtime Environment是一个SPECIFIC组件,就像Java Development Kit一样 。

Java Runtime Environment不是“来自Sun”

遗憾的是,这篇文章不仅是错误的,而且传播了错误观念,即运行Java需要Sun Microsystems:<<“Java Runtime Environment,或JRE,是Sun Microsystems的软件包,它允许计算机系统运行Java应用程序。”>>Sun实际上拥有(* note1)Java规范,但任何人(* note2)都可以编写Java Runtime实现。(注意1:好的,确定,有JCP,但实际上Sun拥有该语言。)(注2:好的,不是任何人;编写实现的人必须承诺不破坏规范(例如,像微软试图做的那样)通过许可Sun的规范 - 但这只是实现虚拟机的权利。)。

当然,sun的方式限制了规范,只有基于Sun实现的运行时才能访问测试工具包,这是他们遵守Java许可要求的证明。没有测试,您不能称自己为Java或避免侵犯各种软件专利。SteveLoughran2007年10月10日20:00(UTC)

在sun.com下载页面上,当前版本是“Java(TM)SE Runtime Environment 6”。java.com测试页要我更新到“版本6更新2”。我安装的版本是最近的(几周),但版本号为1.5.0_11。

-87.162.24.12610:46,2007年7月24日(UTC)

这也是我的猜测,但是Sun似乎并没有直截了当地承认1.6可能和6相同,而且颠覆了6. FWIW我刚刚下载了Sun在Vista Home Premium和Java Control上调用的最新版本Panel报告版本标准版6,版本1.6.0(版本1.6.0_02-b06)。当我使用Netscape Navigator(版本9.0b3)访问Sun的测试页时,测试页报告版本:6更新2.但是,使用Firefox 2.0.0.6,Sun的测试页报告java.lang.NullPointerException,正如其他人所发现的那样。

通过阅读长期存在的bugzilla 83376(自2001年以来)追踪了Java引发FF2异常的可能原因看起来Sun的Java插件(甚至是最新版本)在FF2下使用了useragent(UA)欺骗(仍然一些网站所需要的,因为,用Sun自己2001年的话来说:“Java插件依赖于用户代理字符串来获取版本信息,不会做出修复。”很好,最后。这意味着FF的UA必须在启动时默认(不是欺骗)。如果FF的UA被欺骗,那么下次FF启动时Java会引发异常。尴尬,但至少我现在有一个解决方法修复。

奇怪的是,JRE术语(这个术语很常见)会重定向到Java虚拟机,而Java虚拟机主要由已经知道Java是什么的人使用。似乎更好地解释什么是JRE,并在那里提供wiki链接。

相关词汇