✅ 操作成功!

jre版本 软件java是什么意思

发布时间:2023-06-16 作者:admin 来源:文学

jre版本 软件java是什么意思

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:本文章来源于北大青鸟广安门校区官网)

👁️ 阅读量:0