`
feidi
  • 浏览: 122014 次
社区版块
存档分类
最新评论

[转贴]将Jar文件制作成exe文件

阅读更多

用Java 开发程序,发布时总要考虑的问题就是怎么在使用者的机器上装好JRE。要考虑的问题很多:使用者有没有能力独自安装JRE,使用者已有的JRE和我们需要 的版本是不是一致,会不会出现版本问题,等等。使用.NET要考虑的问题就少些。现在.NET CLR似乎已经很普及了,看好多D版的Win XP都会自己安装最新的.NET CLR,而且似乎它的安装界面也比JRE友好些。彻底解决安装JRE的问题的方案,就是让我们的应用程序自己背着JRE!这样,我们的程序就像传统的 Win32应用程序一样,双击就可以执行,不用管所在的机器上是否有JRE,是什么版本的JRE,无论怎样,我有我自己的!要做到这一点,其实非常容易。
王 森在他的《Java深度历险》(强力推荐这本书,内容少而精)的第一章就解释了JDK,JRE,JVM之间的关系。解释了我们执行java.exe时发生 的事情。其中提到,java.exe依照一套逻辑来寻找可以用的JRE,首先查找自己所在的目录下有没有JRE(据王森讲这样说不确切,我没有JDK全部 的源代码,在此无从考证);其次查找自己的父目录下有没有JRE;最后才是查询Windows的注册表。
通常我们在安装好了JRE的机器上的任何 一个目录下都可以执行java.exe。因为它在安装时被复制到了windows的system32目录下,而后者无论如何都会在path环境变量中。这 个java.exe最终必然会访问注册表来确定真正的JRE的所在地。若我们要求每一个应用程序都自带JRE,必然不能走这条路。但,逻辑的第二条讲, java.exe会在它的父目录下查找JRE,解决方案就在这一条中。
假设我们的应用程序打好了包,叫做MyApp.jar,放在MyApp的目 录下。我们在MyApp目录下,可以执行java –jar MyApp.jar来运行我们的程序。我们安装的是JRE 1.5,在C:\Program Files\Java\jre1.5.0下。现在,我们只需要简单的将jre1.5.0目录搬到MyApp目录下,顺便改个容易写的名字比如叫jre。现 在,我们的应用程序就象这样:
MyApp
       MyApp.jar
       Jre
              Jre1.5.0目录下的全部内容
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 1.5有接近70MB,作为我们的私有的JRE,好多内容都是可以抛弃的。Jre目录下的license都可以不要,bin下的执行文件只需要保留 java.exe或者javaw.exe,lib下只要保留rt,jsse,jce,charsets几个库就可以了。除了i386和zi两个子目录外, 其余的子目录都可以不要。Zi下只需要保留自己地区的子目录和其下的一些文件就可以。Lib下除了库之外的属性文件等等都要保留。这样清理一番,JRE仍 然有接近50MB。还可以继续清理几个库文件里面不需要的内容,这需要仔细的整理,会很费功夫。最好能写出一个自动工具帮助我们整理它们。从Sun公司上 下到的JMF里面附带的用Java写的媒体播放器就自带了JRE,只有几个MB。
清理过后需要运行几遍我们的应用程序,以确保我们的JRE不缺少东西。
如果我们希望能有一个程序直接启动我们的应用程序,那就还要费些功夫。最简单的方法是弄出一个快捷方式来,但是快捷方式的路径不能是相对的,不方便我们安装。我想到的方案就是用Win32程序包装一下。在VS.NET下写一个Win32小程序:
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.
            0,                // 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文件,我们的程序启动了,看起来和传统的Win32程序没有两样,JRE完全被隐藏在底层。

补充几条:
一、exe4j。
    说明:exe4j可以将Jar文件制作成exe文件,但需jre支持,也可将Jar文件放在外面。
    软件性质:共享软件
    下载地址:http://www.ej-technologies.com/products/exe4j/overview.html
二、JBuilder。
    说明:新版本的JBuilder可以直接把工程制作成各系统的可执行文件,包括Windows系统。
    软件性质:商业软件
    下载地址:略。我是从eMule下载的。
三、NativeJ。
    说明:与exe4j功能类似。
    软件性质:共享软件
    下载地址:http://www.dobysoft.com/products/nativej/download.html
四、Excelsior JET。
    说明:可以直接将Java类文件制作成exe文件,除AWT和Swing及第三方图形接口外可不需jre支持(Java5.0不行)。
    软件性质:共享软件
    下载地址:http://excelsior-usa.com/home.html
五、jshrink。
    说明:可将Jar文件打包进exe文件。同时具有混淆功能(这才是它的主要功能)。
    软件性质:共享软件
    下载地址:http://www.e-t.com/jshrink.html
六、InstallAnywhere。
    说明:打包工具,对Java打包最好用。可打包成各操作系统运行包。包括Windows系统。
    软件性质:商业软件。
    下载地址:http://www.zerog.com/
七、InstallShieldX。
    说明:与InstallAnywhere类似,但比InstallAnywhere功能强大。相对的,比较复杂,不易上手,我现在还没学会。
    软件性质:商业软件。
    下载地址:http://www.installshield.com/

分享到:
评论

相关推荐

    MinecraftTexturePack

    3. 优化与打包:设计完成后,需要将所有纹理整合成一个.zip或.jar文件,这就是我们所说的纹理包。同时,还需要创建一个metadata.json文件,用于游戏识别和显示纹理包的名称、作者等信息。 三、纹理包的应用 1. ...

    hi-z测试文件遮挡剔除

    hi-z测试文件遮挡剔除

    毕业设计-喝酒-整站商业源码.zip

    毕业设计-喝酒-整站商业源码.zip

    生成对抗网络在计算机视觉领域的应用.pdf

    生成对抗网络在计算机视觉领域的应用.pdf

    光学仿真领域COMSOL远场偏振通用计算方法及Matlab辅助分析

    内容概要:本文详细介绍了COMSOL在远场偏振通用计算中的应用,涵盖从建模到仿真的完整流程。首先解释了远场偏振的概念及其在光学模拟中的重要性,接着逐步讲解了如何在COMSOL中建立光学模型、划分网格、设置参数并运行仿真。随后,重点讨论了如何解读远场偏振图和能带结构图,最后介绍了如何使用Matlab程序读取COMSOL输出数据并进行进一步的分析和绘图。通过这些步骤,读者可以全面掌握COMSOL在远场偏振计算中的应用。 适合人群:从事光学仿真领域的研究人员和技术人员,尤其是那些希望深入了解COMSOL软件及其与Matlab集成使用的专业人士。 使用场景及目标:适用于需要进行复杂光学仿真和数据分析的研究项目,旨在提高对光波传播行为和材料特性的理解,促进相关领域的科研创新。 阅读建议:建议读者跟随文中提供的具体步骤进行实际操作练习,同时结合Matlab代码示例加深理解。对于初学者来说,可以从简单模型入手,逐渐过渡到更复杂的仿真任务。

    07-组成原理1.3选择6-10.sz

    07-组成原理1.3选择6-10.sz

    SecureCRT-Portable安装包

    SecureCRT-Portable安装包

    机器人导航中改进DWA算法的地图动态优化与路径规划 自适应动态窗口 改进DWA算法:支持地图换图与自我输入栅格地图的优化路径规划方法

    内容概要:本文详细介绍了对传统DWA(Dynamic Window Approach)算法的改进,旨在解决机器人在复杂环境中遇到的问题。主要改进点包括:地图动态优化,允许通过图片形式加载并随时更换地图;引入自适应动态窗口策略,帮助机器人逃出C型障碍物等复杂地形的局部最优解;以及轨迹优化,使机器人的移动轨迹更优、更光滑、速度更快。实验结果显示,改进后的DWA算法在实际应用中表现出色,提高了机器人应对复杂环境的能力。 适合人群:从事机器人研究、开发及相关领域的科研人员和技术爱好者。 使用场景及目标:适用于需要在复杂环境中进行高效、安全导航的机器人系统,如无人驾驶车辆、自动导引车(AGV)等。目标是提升机器人在未知或变化环境中自主导航的能力。 其他说明:本文不仅提供了理论分析,还展示了具体的实现方法和效果对比,有助于读者深入理解改进措施及其带来的性能提升。

    钉钉消息加密及批量推送系统1.0上线

    钉钉消息加密及批量推送系统1.0上线

    液滴偏心碰撞的多体耗散粒子动力学研究.pdf

    液滴偏心碰撞的多体耗散粒子动力学研究.pdf

    MATLAB环境下的一维时间序列信号同步压缩小波包变换算法及其应用 MATLAB

    内容概要:本文详细介绍了在MATLAB R2018A环境中实现的一维时间序列信号同步压缩小波包变换算法。该算法通过引入同步压缩技术,显著提升了对信号瞬时成分的检测能力。文中不仅阐述了算法的基本原理和执行步骤,还展示了其在模拟信号和实际信号(如金融时间序列、地震信号、语音信号、声信号、生理信号等)中的具体应用实例。此外,文章讨论了算法的应用范围和迁移潜力,强调了其在多个领域的广泛应用前景。 适合人群:从事信号处理、数据分析及相关领域的研究人员和技术人员,尤其是那些熟悉MATLAB并希望深入了解小波包变换技术的人群。 使用场景及目标:适用于需要对一维时间序列信号进行高精度时频分析的研究项目。主要目标是提高对信号瞬时成分的检测能力和提取有用的特征信息,从而为后续的数据处理和分析提供坚实的基础。 其他说明:该算法不仅可以应用于现有的MATLAB环境,还可以迁移到其他类似平台,进一步扩展其应用场景。同时,文中提供的代码示例和参数设置指南有助于读者快速上手并深入理解算法的工作机制。

    基于dq坐标系的构网变流器功率控制技术:下垂控制与电压前馈响应的应用 电力电子

    内容概要:本文详细介绍了构网变流器在dq坐标系下的功率控制技术,重点探讨了下垂控制、无功下垂比例积分控制以及电压电流双闭环和电压前馈技术。通过这些技术手段,可以实现功率的准确、快速无静差跟踪和电压的高精度跟踪。文中还展示了具体的控制算法和伪代码示例,解释了如何利用PID和PI控制器调整系统参数,确保电力系统的稳定性和高效运行。 适合人群:从事电力电子系统研究与开发的技术人员,尤其是关注构网变流器功率控制领域的工程师和研究人员。 使用场景及目标:适用于需要优化电力系统性能的实际工程应用场景,旨在提高电力传输的稳定性、可靠性和效率。目标是帮助技术人员理解和掌握先进的功率控制技术,提升系统设计能力。 其他说明:随着电力电子技术的发展,新的控制策略和算法不断涌现,未来的研究将继续探索更高性能的解决方案,以应对更加复杂的电力系统需求。

    MAX31865.PDF

    MAX31865.PDF

    程序员2023年5月模拟试题1_1-10.pdf

    软考初级程序员相关文档

    langgenius-gpustack_0.0.7-offline.difypkg

    dify离线插件

    毕业设计-封装免签版苹果APP-整站商业源码.zip

    毕业设计-封装免签版苹果APP-整站商业源码.zip

    Python 安装使用全解析:下载配置、入门实操与算法应用指南

    打造 Python 安装使用教程,涵盖下载安装、入门操作及基础算法应用,详解环境搭建与实操技巧,助你快速掌握 Python,无论是编程新手还是想强化技能者,都能借此轻松提升,开启高效编程之旅。

    毕业设计-活动报名4.2.6+年卡1.1.7 全开源-整站商业源码.zip

    毕业设计-活动报名4.2.6+年卡1.1.7 全开源-整站商业源码.zip

    毕业设计-美容美发营销版小程序V2.0.1前后端完整源码-整站商业源码.zip

    毕业设计-美容美发营销版小程序V2.0.1前后端完整源码-整站商业源码.zip

    基于西门子S7-1200 PLC的饮料罐装生产线自动化控制流程详解与实战技巧 自动化控制

    内容概要:本文详细介绍了基于西门子S7-1200 PLC的饮料罐装生产线自动化控制系统的设计与实现。文章首先概述了罐装和贴标的主流程,通过梯形图程序展示了关键步骤,如罐装等待、压紧等待和贴标等待的具体逻辑。接着,重点讨论了实际调试过程中遇到的问题及其解决方案,如调整灌装时间和贴标机的安全区控制。此外,还提到了人机交互界面(HMI)的设计,特别是针对操作工人反馈进行优化的部分。最后,文中分享了一些实用的编程技巧,如急停触发后的批量复位、边沿检测以及产量统计。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程有一定基础并希望深入了解饮料罐装生产线自动化控制的人群。 使用场景及目标:适用于需要理解和实施饮料罐装生产线自动化控制的企业和个人。目标是提高生产线的稳定性和效率,同时掌握PLC编程的实际应用技巧。 其他说明:文章不仅提供了理论知识,还包括了许多来自现场调试的经验教训,有助于读者更好地应对实际工程中的挑战。

Global site tag (gtag.js) - Google Analytics