JDK中JRE与Program Files中的JRE的区别

来源:互联网 发布:第三方软件问题 编辑:程序博客网 时间:2024/06/06 13:59

JDK中JRE与Program Files中的JRE的区别

转自http://www.cnblogs.com/xiaofeixiang/p/4085159.html

jvm是jre里头一个动态连接函数库,jdk里面的jre一般用于运行java本身的程序,比如javac,等等.programfiles下面的jre用于运行用户编写的java程序. JRE下的bin\client 或者 bin\server 的jvm.dll就是JVM了

1. java.exe 如何寻找JRE库的:

当在控制台执行java.exe,操作系统寻找JRE的方式如下:

  1. 先找当前目录下有没有JRE
  2. 再找父目录下有没有JRE
  3. 接着在PATH路径中找JRE
  4. 注册表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看CurrentVersion的键值指向哪个JRE

所以当运行的是jdk\bin\java.exe的时候,用的jre是bin的父目录jdk下面的jre,运行java.exe找到了jre后有一个验证程序,验证jre和java.exe的版本是否一致,如果不一致则会发生错误

java -verbose:class Main 显示调用的详细信息

2. JRE类库查找

JRE自带的基础类库主要是JRE\lib t.jar这个文件,包括了Java2平台标准版的所有类库。和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的版本管理是非常简单有效的,也许很原始,不过很好用,简单就不容易出错。

3. Java的虚拟机启动和加载类库

在Console执行java.exe xxx命令以后,如前所述的寻找JRE,OS找到JRE目录,根据java.exe的传递参数,选择加载Server版的jvm.dll还是Client 版的jvm.dll,然后加载jvm.dll,把控制权交给jvm.dll。

接下来,jvm.dll进行初始化,分配内存等等动作,然后在CLASSPATH路径中寻找class,找到class以后,寻找class中的程序入口点Main函数,然后从Main函数执行程序,在执行过程中,使用ClassLoader动态加载一系列引用到的类。当调用到native方法时,jvm.dll告诉OS在JRE\bin目录下寻找某某DLL文件,调入内存,于是实现了JNI调用。

最后简单说运行实现我们希望目的目录结构(以test目录为例):
test 存项目java文件生成的.class,.jar 等文件.
test/jre/bin 复制对就jdk中的 bin目录就可以。
test/jre/lib 复制对就jdk中的 jre/lib 目录就可以。
建立以上目录结果之后就可以将test/jre/bin/java.exe 发送到桌面快捷方式。
然后修改一下那快捷快方式 目标(T)标位 改成 …../test/jre/bin/java.exe test ,
这里要注意的是 起始位置(S) 一起在改一下!如下:…../test/ 这个为什么就不用我说了,自己体会吧。:D

对了,再烦一下,使用javaw.exe 试试,可以不要那个该死的console窗口哦。希望上面的文章对大家有所帮助。

0 0
原创粉丝点击