如何让java运行在指定版本的JRE中

来源:互联网 发布:nba奇葩数据 编辑:程序博客网 时间:2024/05/15 08:26

写个主要想法是java 版本众多,也不知道客户安装那个版本java. 还有就是为了简化发布工作,可以直接把文档发送到客户端就可以了.

首要有必要了解一下java.exe 如何寻找JRE库的:


当在控制台执行java.exe,操作系统寻找JRE的方式如下:
1) 先找当前目录下有没有JRE
2)再找父目录下有没有JRE
3)接着在PATH路径中找JRE
4)注册表HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment/ 查看CurrentVersion的键值指向哪个JRE


2.JRE类库查找

JRE自带的基础类库主要是JRE/lib/rt.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窗口哦。哈哈。