初步总结CLR和JRE运行机制

开发 后端
文章主要介绍了CLR和JRE运行机制,关于类库的版本管理问题,JRE的版本管理,.Net Framework的版本管理,JRE的基础类库和.Net Framekwork的核心类库。

大家有时往往对于一些基础的概念很模糊,在这里我对几个概念的比较JRE CLR(运行环境),JDK .Net Framework(开发框架)和JRE类库的查找方法和版本管理,大家快来看看下面的介绍吧。

关于类库的版本管理问题

Java和C#代码运行要依靠其运行环境(JRE,CLR)和运行环境带的基础类库(C#称为配件或者程序集Assembly),此外还会有一些第三方的类库或者自己开发的类库。如果运行环境版本不一致,或者引用的类库版本不一致都会带来程序不能正常运行。比如一个Java程序是在JDK1.2上开发,如果在JRE1.4上运行,一般情况下可以向下兼容,但也有例外,有些GUI程序在JDK1.4上面运行结果很可能会不同。

CLR和JRE运行机制之JRE的版本管理

Java的解决办法是每个程序自己携带一套JRE。
我的机器上已经被安装了好多套JRE和JDK了(JDK包括了同版本的JRE,此外还包括有编译器和其它工具),它们分别是:
◆BEA Weblogic Server 7.0 自带一套 JDK1.3.1_02
◆我下载了一套最新的JDK1.4.1_02
◆JBuilder9自带一套JKD1.4.1_02
◆Oracle8.1.7自带一套JRE1.1.7
◆Ration Rose自带一套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,不会造成版本混乱。

CLR和JRE运行机制之.Net Framework的版本管理

.Net Framework被固定安装在C:\Winnt\Microsoft.NET\Framework\v版本号\目录下,并且在同一台机器只能安装一套,要安装1.1版本的.Net Framework,就必须先删除1.0的。听说刚发行的.Net Framework1.1已经对1.0做了很多改进,甚至基础类库的层次也有所变动。看来在旧版本的.Net Framework开发的程序将来往新版本上面迁移的时候少不了修改程序代码。

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

CLR和JRE运行机制之JRE类库的查找方法和版本管理

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的了解程度)

【编辑推荐】

  1. CLR函数实现字符串排序七步通
  2. CLR线程池教程四大功能详解
  3. CLR程序集教程新手上路
  4. 全面解析CLR是什么一点通
  5. 趣谈CLR中的静态构造函数
责任编辑:田树 来源: mscto
相关推荐

2015-11-20 11:20:54

js开发

2010-09-28 11:05:49

jQuery

2019-05-10 14:00:21

小程序运行机制前端

2009-12-11 10:52:37

PHP运行机制

2009-02-03 14:00:20

PHP运行PHP调用PHP原理

2010-02-01 17:19:30

C++运行机制

2018-12-26 16:30:09

SQL Server内部运行机制数据库

2019-08-15 10:17:16

Webpack运行浏览器

2023-05-26 08:01:01

FacebookVelox机制

2010-01-05 16:10:21

.NET Framew

2019-10-11 09:00:00

JavaScriptEvent Loop前端

2010-02-23 10:15:22

WCF运行机制

2012-03-06 10:22:00

程序

2015-11-16 11:17:30

PHP底层运行机制原理

2016-12-13 14:12:25

程序机制

2016-12-14 14:41:20

Hello World程序运行机制

2010-05-06 17:54:54

Oracle锁

2017-07-12 14:58:21

AndroidInstant Run

2011-04-27 09:22:28

C#延迟加载

2022-02-11 23:11:09

Kubernetes集群容器化
点赞
收藏

51CTO技术栈公众号