知识大全 分享:让Java程序带着jre一起上路

Posted

篇首语:男人无志,钝铁无钢,女人无志,乱草无秧。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 分享:让Java程序带着jre一起上路相关的知识,希望对你有一定的参考价值。

分享:让Java程序带着jre一起上路  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  用Java开发程序 发布时总要考虑的问题就是怎么在使用者的机器上装好JRE 要考虑的问题很多 使用者有没有能力独自安装JRE 使用者已有的JRE和我们需要的版本是不是一致 会不会出现版本问题 等等     使用 NET要考虑的问题就少些 现在 NET CLR似乎已经很普及了 看好多D版的Win XP都会自己安装最新的 NET CLR 而且似乎它的安装界面也比JRE友好些 彻底解决安装JRE的问题的方案 就是让我们的应用程序自己背着JRE!这样 我们的程序就像传统的Win 应用程序一样 双击就可以执行 不用管所在的机器上是否有JRE 是什么版本的JRE 无论怎样 我有我自己的!要做到这一点 其实非常容易     王森在他的《Java深度历险》(强力推荐这本书 内容少而精)的第一章就解释了JDK JRE JVM之间的关系 解释了我们执行java exe时发生的事情 其中提到 java exe依照一套逻辑来寻找可以用的JRE 首先查找自己所在的目录下有没有JRE(据王森讲这样说不确切 我没有JDK全部的源代码 在此无从考证) 其次查找自己的父目录下有没有JRE 最后才是查询Windows的注册表     通常我们在安装好了JRE的机器上的任何一个目录下都可以执行java exe 因为它在安装时被复制到了windows的system 目录下 而后者无论如何都会在path环境变量中 这个java exe最终必然会访问注册表来确定真正的JRE的所在地 若我们要求每一个应用程序都自带JRE 必然不能走这条路 但 逻辑的第二条讲 java exe会在它的父目录下查找JRE 解决方案就在这一条中     假设我们的应用程序打好了包 叫做MyApp jar 放在MyApp的目录下 我们在MyApp目录下 可以执行java –jar MyApp jar来运行我们的程序 我们安装的是JRE 在C:\\Program Files\\Java\\jre 下 现在 我们只需要简单的将jre 目录搬到MyApp目录下 顺便改个容易写的名字比如叫jre 现在 我们的应用程序就象这样     MyApp  MyApp jar  Jre  Jre 目录下的全部内容    Java exe就在jre目录下的bin目录中 根据第二条逻辑 java exe会在它的父目录中查找jre 实验证实 它会查找lib目录 而lib就在jre目录下 因此 这样java exe就会确定jre的所在然后正常执行java程序 不会去管我们是否安装了JRE 注册表中是否有注册项这些杂事了     试一下 在命令行下进入MyApp的目录下 假设它在C盘 将path指向MyApp下的JRE   set path=c:\\MyApp\\jre\\bin    然后运行   java –verbose –jar MyApp jar    加上verbose参数以确定我们确实用了这一套被搬出了家的JRE     程序可以运行 并且在命令行输出的前几行 可以看到     [Opened C:\\MyApp\\jre\\lib\\rt jar]  [Opened C:\\MyApp\\jre\\lib\\jsse jar]  [Opened C:\\MyApp\\jre\\lib\\jce jar]  [Opened C:\\MyApp\\jre\\lib\\charsets jar]    因此程序读取的确实是它的私有的JRE     至此 我们似乎完成了任务 但是现在我们的私有JRE仍不完美 缺点是太大 JRE 有接近 MB 作为我们的私有的JRE 好多内容都是可以抛弃的 Jre目录下的license都可以不要 bin下的执行文件只需要保留java exe或者javaw exe lib下只要保留rt jsse jce charsets几个库就可以了 除了i 和zi两个子目录外 其余的子目录都可以不要 Zi下只需要保留自己地区的子目录和其下的一些文件就可以 Lib下除了库之外的属性文件等等都要保留 这样清理一番 JRE仍然有接近 MB 还可以继续清理几个库文件里面不需要的内容 这需要仔细的整理 会很费功夫 最好能写出一个自动工具帮助我们整理它们 从Sun公司上下到的JMF里面附带的用Java写的媒体播放器就自带了JRE 只有几个MB     清理过后需要运行几遍我们的应用程序 以确保我们的JRE不缺少东西     如果我们希望能有一个程序直接启动我们的应用程序 那就还要费些功夫 最简单的方法是弄出一个快捷方式来 但是快捷方式的路径不能是相对的 不方便我们安装 我想到的方案就是用Win 程序包装一下 在VS NET下写一个Win 小程序     int PASCAL WinMain( HINSTANCE hInstance   HINSTANCE hPrevInstance   LPSTR lpszCmdLine   int nCmdShow )  STARTUPINFO si;  PROCESS_INFORMATION pi;  ZeroMemory( &si sizeof(si) );  si cb = sizeof(si);  ZeroMemory( &pi sizeof(pi) );  // Start the child process   if( !CreateProcess( jre\\\\bin\\\\javaw exe //执行的程序名   jre\\\\bin\\\\javaw exe jar MyApp jar // 带参数的执行程序  NULL   // Process handle not inheritable   NULL   // Thread handle not inheritable   FALSE   // Set handle inheritance to FALSE      // No creation flags   NULL   // Use parent s environment block   NULL   // Use parent s starting directory   &si   // Pointer to STARTUPINFO structure   &pi )  // Pointer to PROCESS_INFORMATION structure   )        ErrorExit( CreateProcess failed );     // Wait until child process exits   WaitForSingleObject( pi hProcess INFINITE );  // Close process and thread handles   CloseHandle( pi hProcess );  CloseHandle( pi hThread );    基本上是按照MSDN文档中的例子照搬的 将它编译成一个EXE文件 我们的任务才全部完成 双击这个EXE文件 我们的程序启动了 看起来和传统的Win 程序没有两样 JRE完全被隐藏在底层     P S 使用了这个方案后 我用Wise Installation System制作安装程序 发现一个非常奇怪的问题 安装结束后 安装程序似乎非要运行一个叫做GLJ什么什么 后缀是TMP的程序 还需要JVM 结果就报错JVM DLL找不到 安装总是不成功 我已经禁掉了OCX / DLL / EXE自注册和卸载支持 为什么还不对?有谁知道是为什么吗? cha138/Article/program/Java/hx/201311/26180

相关参考

知识大全 分享关于Java 语言中的函数编程

分享关于Java语言中的函数编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果您从事大型企

知识大全 跪求苏教版小学六年级下册语文评价手册阅读训练6(《访兰》 《 带着梦想上路》)及全部答案单元练习6

跪求苏教版小学六年级下册语文评价手册阅读训练6(《访兰》《带着梦想上路》)及全部答案单元练习6《访兰》1.答:贴切,因为清妙是清秀淡雅的意思,作者将野兰人格化,可见作者对它的喜爱之情。2.选B3.描写

知识大全 让Java程序只运行一个实例

让Java程序只运行一个实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一个程序可以在内存里

知识大全 Java编程思想里的泛型实现一个堆栈类 分享

Java编程思想里的泛型实现一个堆栈类分享  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  觉得作

知识大全 Java中new关键字和newInstance方法的区别分享

Java中new关键字和newInstance方法的区别分享  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 Java SE 6之脚本引擎 让程序如虎添翼

JavaSE6之脚本引擎让程序如虎添翼  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!现在JavaS

知识大全 JDK,JRE,JVM的区别与联系

JDK,JRE,JVM的区别与联系  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很多朋友可能跟

知识大全 Java程序性能优化--让你的Java程序更快、更稳定

Java程序性能优化--让你的Java程序更快、更稳定  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 如何保护Java程序

如何保护Java程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java是一种跨平台的解释型

知识大全 扫雷程序(Java语言)

扫雷程序(Java语言)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  importjavaaw