
jre版本 软件java是什么意思
团支部总结-诸葛亮的简介
2023年3月3日发(作者:性暖花开)Java程序开发中遇到的JRE问题
Java程序开发中遇到的JRE问题
在开发Java程序,发布的时候,关于JRE要考虑的问题很多:
1,使用者有没有能力独自安装JRE?
2,使用者已有的JRE和我们需要的版本是不是一致?
3,会不会出现版本问题?
…………
而使用.Net就不用考虑那么多问题了,因为现在很多Winxp都会自带最新的.NETCLR,
而且个人觉得CLR的安装界面也比较友好。
那我们怎么解决JRE的这些问题呢?
YES!就是让我们的Java程序带上JRE。这样我们的Java程序就可以像Win32的应用程序
一样双击就可以执行,而不管设备上是否有JRE,或者是与需要的版本不一样的JRE了
在《Java深度历程》中有提到到JDK,JRE,JVM三者的关系,会优先查找自己
所在的目录下是否有JRE,其次查找父目录,最后才查Windows注册表.
通常我们的Java程序在安装了JRE的设备上的任意目录都可以执行,就是通过注册表的
信息来查找JRE的,但是我们要让每一个Java程序都带上JRE,就必然不能让Java程序通过注
册表来查找JRE了
逻辑的第二条讲,会在它的父目录下查找JRE,解决方案就在这一条中。
假设我们的Java程序打好了包,叫做,放在TestApp的目录下。我们在
TestApp目录下,可以执行java?来运行我们的Java程序。我们安装的是JRE
1.5,在C:ProgramFilesJavajre1.5.0下。现在,我们只需要简单的将jre1.5.0目录搬
到TestApp目录下,顺便改个容易写的名字比如叫jre。现在,我们的Java程序就象这样:
TestApp
Jre
Jre1.5.0目录下的全部内容
就在jre目录下的bin目录中。根据第二条逻辑,会在它的父目录中
查找jre,实验证实,它会查找lib目录,而lib就在jre目录下。因此,这样就会确
定jre的所在然后正常执行java程序,不会去管我们是否安装了JRE,注册表中是否有注册项
这些杂事了。
试一下,在命令行下进入TestApp的目录下,假设它在C盘,将path指向TestApp下的JRE:
setpath=c:TestAppjrebin
然后运行:
java?verbose?
加上verbose参数以确定我们确实用了这一套被搬出了家的JRE。
我们的Java程序可以运行,并且在命令行输出的前几行,可以看到:
[OpenedC:]
[OpenedC:]
[OpenedC:]
[OpenedC:]
因此Java程序读取的确实是它的私有的JRE。
至此,我们似乎完成了任务。但是现在我们的私有JRE仍不完美,缺点是太大。JRE1.5
有接近70MB,作为我们的私有的JRE,好多内容都是可以抛弃的。Jre目录下的license都可
以不要,bin下的执行文件只需要保留或者,lib下只要保留rt,jsse,jce,
charsets几个库就可以了。除了i386和zi两个子目录外,其余的子目录都可以不要。Zi下只
需要保留自己地区的子目录和其下的一些文件就可以。Lib下除了库之外的属性文件等等都
要保留。这样清理一番,JRE仍然有接近50MB。还可以继续清理几个库文件里面不需要的内
容,这需要仔细的整理,会很费功夫。最好能写出一个自动工具帮助我们整理它们。从Sun
公司上下到的JMF里面附带的用Java写的媒体播放器就自带了JRE,只有几个MB。
清理过后需要运行几遍我们的Java程序,以确保我们的JRE不缺少东西。
如果我们希望能有一个程序直接启动我们的Java程序,那就还要费些功夫。最简单的方
法是弄出一个快捷方式来,但是快捷方式的路径不能是相对的,不方便我们安装。我想到的
方案就是用Win32程序包装一下。在下写一个Win32小程序:
intPASCALWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpszCmdLine,
intnCmdShow)
{
STARTUPINFOsi;
PROCESS_INFORMATIONpi;
ZeroMemory(&si,sizeof(si));
=sizeof(si);
ZeroMemory(π,sizeof(pi));
//Startthechildprocess.
if(!CreateProcess(\"\",//执行的程序名
\"\",//带参数的执行程序
NULL,//Processhandlenotinheritable.
NULL,//Threadhandlenotinheritable.
FALSE,//SethandleinheritancetoFALSE.
0,//Nocreationflags.
NULL,//Useparent\'senvironmentblock.
NULL,//Useparent\'sstartingdirectory.
&si,//PointertoSTARTUPINFOstructure.
π)//PointertoPROCESS_INFORMATIONstructure.
)
{
ErrorExit(\"CreateProcessfailed.\");
}
//Waituntilchildprocessexits.
WaitForSingleObject(ss,INFINITE);
//Closeprocessandthreadhandles.
CloseHandle(ss);
CloseHandle(d);
}
以上是按照MSDN的文档例子做的,经过测试,我们的Java程序启动了,使用起来和Win32
的程序没有什么两样,JRE也隐藏起来了!
(ps:本文章来源于北大青鸟广安门校区官网)