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

[转贴]将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/

分享到:
评论

相关推荐

    用C#制作PDF文件全攻略

    PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段“暴力”破解的方法,代码片断如下:

    PDF文件制作全攻略大全

    PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段“暴力”破解的方法,代码片断如下: ...

    【转贴】寻迹小车制作明细

    智能寻迹小车的详细制作资料,源程序,数据手册,电子原理图、PCB电路板文件,机械设计图纸,机械装配图,元器件清单,材料明细,制作工艺 电机驱动H桥部分电原理图.pdf 小车MCU控制部分原理图.pdf . 程序源代码集合

    动网转贴.e.rar

    【标题】"动网转贴.e.rar"是一个压缩文件,很可能包含了有关动网论坛或社区的相关资源、数据或用户帖子的备份。动网是中国早期知名的网络论坛软件之一,提供了丰富的社区功能,允许用户发帖、回帖、互动等。这个...

    易语言动网转贴

    动网可能是一个论坛或社区平台,转贴功能则是将某个地方的帖子复制到另一个地方,保持其内容完整。 在这个源码中,涉及了以下几个核心知识点: 1. **窗口名**:在编程中,窗口名通常指的是一个应用程序或界面的...

    Mapinfo10汉化文件

    Mapinfo10是一款知名的地理信息系统(GIS)软件,主要用于地图制作、数据分析以及地理信息处理。在中文环境下,用户可能需要汉化版以便更好地理解和操作软件。"Mapinfo10汉化文件"指的是针对Mapinfo 10.0.0.26这个...

    以u-boot为例介绍如何在MDK下调试elf格式文件.pdf(转贴附件)

    根据提供的文件信息我们可以深入探讨如何在MDK环境下调试U-Boot中的ELF格式文件的相关知识点。 ### U-Boot简介 U-Boot(Universal Boot Loader)是一个开放源代码的引导加载程序项目,支持多种处理器架构(如ARM、...

    BFC UBB转贴器

    这是一个类似论坛转贴工具的小程序,可以将剪贴板中的HTML代码转换为论坛支持的UBB代码。 由于现在流行的转贴工具都是基于浏览器的,转换速度比较慢,还得打开浏览器才能使用(同时受到浏览器版本限制)。 <br...

    windows 下的grep,转贴

    标题中的“windows 下的grep,转贴”表明我们要讨论的是如何在Windows操作系统中使用grep命令,这个命令通常在Unix或Linux环境中用于搜索文本文件中的特定模式。在Windows中,由于默认命令行环境(CMD)不支持grep,...

    xp下安装IIS6.0所需要的386文件集合

    最近在xp上安装IIS6,搞了一个上午,在csdn上下载了n个文件,每个都说最全,结果是从每一个下载中东凑凑,西拼拼,最终搞定! 我不知道我这个是不是最全的,但起码是集4、5个精华于一身了 至于操作步骤,请看转贴 ...

    易语言动网转贴.rar

    由于压缩包文件名为“易语言动网转贴.rar”,我们可以推测这可能是一个软件开发资源,包含了一些源代码、教程或者是相关插件。 在易语言中,"动网"通常指的是动网论坛,这是一个曾经非常流行的网络社区平台。"转贴...

    论坛转贴 v1.0 JS版-源码.zip

    【标题】"论坛转贴 v1.0 JS版-源码.zip" 提供的是一个基于JavaScript的论坛转贴功能的源代码实现。JS版通常指的是使用JavaScript编程语言编写的版本,这表明该软件可能主要用于网页端,利用浏览器的JavaScript引擎...

    Convert X 转贴工具插件 for Discuz!7.0.rar

    在安装过程中,用户可能需要将这个文件或文件夹放置到Discuz! 的特定目录下,以便系统可以识别和调用。 在使用Convert X插件时,用户需要注意版权问题,确保在转移帖子时不侵犯原论坛的权益,尊重原创者的劳动成果...

    Html处理软件、转贴工具(源代码)

    去除Html中的干扰码等(样例中以轻之国度的干扰码为例) 配置文件语法: 方法类型(整数) 最大匹配长度(整数) 字符串1(删除开头) 字符串2(删除结尾) 方法类型: 1:删除单行 2:删除行与行之间的

    论坛专用屏蔽干扰码转贴工具

    此外,压缩包内的“论坛专用屏蔽干扰码转贴工具.exe”是一个可执行文件,表明这是一款Windows平台的应用程序,用户只需双击运行即可使用。 在实际使用中,用户可能需要根据不同的论坛规则和设置调整工具的参数,以...

    jquery的转贴功能实现

    在本主题中,我们将深入探讨如何利用jQuery实现“转贴”功能,这是一种常见的社交媒体分享功能,允许用户将网页内容轻松分享到各种社交网络。 首先,让我们了解一下jQuery的核心概念。jQuery通过一种简洁的语法提供...

    动易系统的论坛转贴工具

    用户只需下载并安装工具,然后在动易系统的论坛中找到想要转贴的帖子,复制帖子内容,打开工具进行转换,最后将转换后的UBB代码粘贴到目标论坛即可。整个过程快捷高效,极大地提高了内容分享的效率。 总的来说,...

    易语言源码动网转贴.rar

    动网转贴可能需要解析这些数据来获取帖子的信息,如标题、内容、作者等,并将它们封装到转发请求中。 3. **用户身份验证**:为了确保用户权限和安全性,动网转贴功能可能涉及到用户登录状态的检查和验证,这可能...

    电子功用-导电胶配对模切对半转贴加工方法

    本篇将详细探讨“电子功用-导电胶配对模切对半转贴加工方法”,这是一种高效的生产工艺,旨在提高电子产品的性能和可靠性。 导电胶主要由导电填料(如金属颗粒)、树脂基体和添加剂组成。它的特性在于既能保持良好...

Global site tag (gtag.js) - Google Analytics