在日常开发中,遇到需要将 Java 的 JAR 包转化为可执行文件 EXE 的情况不在少见。一般常见 Java 编写的 Console、AWT、Swing、SWT 等程序。在项目交付时,通常采用 JAR 打包。不过这样会产生几个常见的问题:

[list style=”arrow” color=”cerulean”]

  • 使用者不熟悉 JAR 包,拿到手不知道怎么运行(这个最常见);
  • JAR 包是完全开放的,只要使用者有一点 Java 基础,想查看和修改其中的源代码都是非常简单的事;
  • 不利于敏感信息的保密

[/list]

这个文章系列主要介绍将将 JAR 转为 EXE 的几种最常用工具。

第一期介绍的工具是 exe4jhttp://www.ej-technologies.com/products/exe4j/overview.html),是一个帮助你集成 Java 应用程序到 Windows 操作环境的 Java 可执行文件生成工具,无论这些应用是用于服务器,还是图形用户界面(GUI)或命令行的应用程序。如果你想在任务管理器中及 Windows XP 分组的用户友好任务栏里以你的进程名取代  java.exe 的出现,那么 exe4j 可以完成这个工作。exe4j 帮助你以一种安全的方式启动你的 Java 应用程序,显示本地启动画面,检测及发布合适的 JRE 和 JDK,以及进行启动时所发生的错误处理等。

准备工作

在开始讲两者的使用和对比之前,先准备一个需要转换的 Java 项目。演示以一个新建的 SWT 项目为例:

[image align=”center” width=”one_half” lightbox=”true”]https://iflbqw.dm1.livefilestore.com/y2pmtNbIjKDx_nlc1SRto8xS2NqopFrGfxS_FVu6JCL1qrw6owBwpPywReSmCOX_VA5YRAWkX_MVncC_dz6-9FPo0oKnsb-F72O2oWMpBNYLNI/1.png[/image]

[image align=”center” width=”one_half” lightbox=”true”]https://ifjcua.dm2301.livefilestore.com/y2pjxFXkl51rfbmkL0yO4SeJQH5SnljTzVTxTDOoiWPI8Y0jUmREguE4IK96mQjBvZviQNZD6VeHBHFWd61-VVvLD63hzNG8qnHp3a3lgFdKRo/2.png[/image]

再新建一个 shell,随便写了一个窗体;

[image align=”center” width=”one_half” lightbox=”true”]https://ifl3la.dm2301.livefilestore.com/y2pt2At8t-YnRucswUMsuX5Z3gthZvOqfPX4sDC6da8Aar0UozYG8ZcQMh12-mQJseVE5CLGV9QDyklPZ2aZQACSNyCLsOkGCpVlbJ-FiI03qA/3.png[/image]

[image align=”center” width=”one_half” lightbox=”true”]https://ifksoq.dm2302.livefilestore.com/y2pkQGN0jHZluyCu-_UGceEwYppqXaOWG0dPYpHra88UYm9PMDEaD_78A07cPNqU3K2OoSki-Rpaw4eoMap0kAutyPkPyjr276dE_NDuNaGh1o/4.png[/image]

将项目导出为 JAR 包,这里要选“可执行的 JAR 包”,否则导出的 JAR 是没有执行入口的;

[image align=”center” width=”one_half” lightbox=”true”]https://k2vz5a.dm2302.livefilestore.com/y2pQ3aLckBRZZx9YSB23X8tKEK8Po4ytOYZ8PVUyXopDCbgNF3HsjuFQSCq7iZvfru1wZHCnGfdRfhWTNeknCxDK2zZ5jAJXtLIDv1EMUPE8XU/5.png[/image]

在“Lunch configuration”中选择项目的入口类,并自己选择好导出位置;

[image align=”center” width=”one_half” lightbox=”true”]https://ifiyqq.dm1.livefilestore.com/y2pnxBCv_2HUWpWVLgUDOgILmGIC9xV14_yxdeWQDx3qQ8BG71QJaUkwI_Wy8_JsIEYnM_wQ4Z1fp-4jIg1qHk8stLE-qhSDR1M7fy9pd43ws0/6.png[/image]

其中 Library handing 一项要特殊说明一下,此处配置的是第三方 JAR 包的配置方式。其中“Extract required libraries into generated JAR”指的是不对第三方 JAR 包做处理“Package required libraries into generated JAR”指的是将第三方 JAR 包打包到最终生成 JAR 包中;“Copy required libraries into a sub-folder next to the generated JAR”指的是将第三方 JAR 包复制到和生成的 JAR 同一目录的一个子文件夹中。我们这里使用第三种处理方式

导出的 JAR 目录结构如下,至此,准备工作就完成了。

[image align=”center” width=”one_half” lightbox=”true”]https://ifkztq.dm1.livefilestore.com/y2pDU1B3mfNH9-LkY4udP24pki7PGOZCVqtFDOxnDDS0E3CVGA66A2FERZqj4zGe3whF-t2V6SVKgvpj3wQUTNNp_NPXQB3HulK0Zr-SLnUPmA/7.png[/image]

exe4j 使用教程

首先下载 exe4j,可以从这儿下载:

Windows 32 位:http://pan.baidu.com/share/link?shareid=1922223599&uk=1426189689

Windows 64 位:http://pan.baidu.com/share/link?shareid=1923937617&uk=1426189689

exe4j 还包含 Mac OS 版和 Linux 版,可以从其官网获取:http://www.ej-technologies.com/download/exe4j/files

下载完成后安装,可以使用以下几个序列号注册,用户名和公司名可随便填:

A-XVK258563F-1p4lv7mg7sav
A-XVK209982F-1y0i3h4ywx2h1
A-XVK267351F-dpurrhnyarva
A-XVK204432F-1kkoilo1jy2h3r
A-XVK246130F-1l7msieqiwqnq
A-XVK249554F-pllh351kcke50
A-XVK238729F-25yn13iea25i
A-XVK222711F-134h5ta8yxbm0
A-XVK275016F-15wjjcbn4tpj
A-XVK275016F-15wjjcbn4tpj

注册完成后应是这样:

[image align=”center” width=”one_half” lightbox=”true”]https://hd1iqw.dm2301.livefilestore.com/y2pu7SB6wjN6RQmJlia9YcQ9NNWerXl8YsG-YpnSmXKsZu0t0QOWVbhbVMmTRef_Mg4fRJgHZkE2Frl_s3aB1-friUzw-3cz9ebO7zswshifwg/8.png[/image]

启动 exe4j:

[image align=”center” width=”one_half” lightbox=”true”]https://hd3jtw.dm2301.livefilestore.com/y2pktwtUR5b5qyxhw1O63mMDHreD1_Dzsi5hAkr3yEVQIvH2jptJJiIHnDylF3C3MYOMH0p76CagfPV5C40SBRpBfOa34NHSm0Lyp_ca_TrxYU/9.png[/image]

第一步 Welcome 的 Open和Reopen 是打开过去的配置文件的,第一次使用直接按 Next 跳过。

接着选择工程类型,选择第二个,可以把程序完全编译成 exe 文件

[image align=”center” width=”one_half” lightbox=”true”]https://k2vz5a.dm2301.livefilestore.com/y2pt-1wPC116EwkuhLKoNYeiy2Kfl5sTm49ZKGzWL6Z5j5QPnd5jo1HS2eWxUAI1nWBuE_3yHthghzJFE0pdgTn2NAapdj6X4dMMCtziJijKoM/10.png[/image]

接着填写应用程序的名字和输出目录

[image align=”center” width=”one_half” lightbox=”true”]https://hd1pla.dm2302.livefilestore.com/y2pD0F6buiZ_n-9t5tl6vS4UAsROf09cWiHpocErlYHkMbXvS-7fsR31eNsUwlX_XL3M_lU37_S4_1Sm_XZMLoQY3VXcBqI-14_f67Kbk0JNL0/11.png[/image]

接着一步是配置 JAR 包运行的参数

[image align=”center” width=”one_half” lightbox=”true”]https://hd20fq.dm1.livefilestore.com/y2pkEQyAd4EyOWWwZCkpZhwa39muB6C48WDNYky6PcogXToSHckdf8dGOLRp2pUuDg-Vja6NUyvcY4DMLD9e9Q0SEPzR8mT62rtbFVzHOrlcDM/12.png[/image]

按从上到下的顺序解释。Excutable type 是指你的程序类型,包含 GUI 程序(包含图形界面的),Console application 是控制台程序,Service 指的是后台运行的服务程序;Excutable name 指的是最终的 EXE 的名字Icon file 可以给你的 EXE 加一个图标Allow only a single running instance of the application 指的是只允许实例化一个应用Fail if an exception in the main thread is thrown 指的是 main 抛出异常的时候终止程序Change working directory to 可以改变工作目录

Advance 设置里面包括:

Redirection,用来重定向错误文件和输出文件的路径;

[image align=”center” width=”one_half” lightbox=”true”]https://hd1pig.dm1.livefilestore.com/y2pVzANQ2xE26THqthETdFiUjRNbzEaI2mLLyJKiE7ZLOIn-g3yNFptoa7_dH5x6_GnmwAwtXP5BZBCAC1PocrF2-4nzIViESTbl4e_di77KTY/13.png[/image]

Service opition,以服务启动的相关设置;

[image align=”center” width=”one_half” lightbox=”true”]https://hd3qqg.dm2302.livefilestore.com/y2pLEzRPwWWQwl7ofGFqqwHT6oGchIr5ddhOJisv16Vdfq4ztoF6Z5-ptTdCv5TfJZ7_Hsir-L2BwjdSoMZGE6lCNbuhN3x3V_MPVSaJDbgBHo/14.png[/image]

Version info,软件的版本信息;

[image align=”center” width=”one_half” lightbox=”true”]https://hd2fcw.dm2302.livefilestore.com/y2pymFJXfIHS3bkAJtTS_Ql7-1BVMGUghPEWMwICC85UA49feqKt-O4nbAqUlDPFNPVuMjT6wTTyTNg_cG0yNMT0Dgm4T95TyMm8avRlFD2dtM/15.png[/image]

32-bit or 64-bit,生成 32 位或者 64 位的 EXE;

[image align=”center” width=”one_half” lightbox=”true”]https://hd1wng.dm2302.livefilestore.com/y2pzGI7OQc0Jh51ionKk7Hyjf27N6_KcHH2gqqCn5Q93FF0e51uTnkTf1ZTd-KgHq3q6nv89fOlTNfQWkoJ4-kQuG7WgRmpCciIolKwt3OqNxc/16.png[/image]

Execution level,软件的运行级别;

[image align=”center” width=”one_half” lightbox=”true”]https://hd0lew.dm2302.livefilestore.com/y2p1ptyXjAN3Sa8B4a9TBpr7OBYmsF0DWppdy4C5XlNwh_oMlCzH_C28BZ-zTcKpG3WyLJrU2NGsuR6XxGNuzb8cqqua0djiI6QwZrZpLLITXQ/17.png[/image]

配置完成后进入 Java invocation;

[image align=”center” width=”one_half” lightbox=”true”]https://6mihoa.dm2301.livefilestore.com/y2pk8eh_WC0Tf-J7u36o9K6sirXEnZJTInAvpCPBYREj4vJDrC7RlKmUXSWYCKXClo1zTF_cjM_0vO_AJu0BEk1xoYjKsch1kCZA6KtlSKYJvM/18.png[/image]

在 Class path 里面添加生成好的JAR包,点击右边的加号;

[image align=”center” width=”one_half” lightbox=”true”]https://6mg8fq.dm2302.livefilestore.com/y2pPghtrB6c65h_9cnQUaMlC-ULybD5lZDid7nU-i0k93nnpxOTtI-KmAA2BmRdryfFuVEJ7r_vKN3CI4Ab_o7VSDEWiWos_aTAG_RRSdk8rP4/19.png[/image]

添加所有的 JAR 文件至 Class path,包括lib文件夹中的第三方 JAR,完成后如下:

[image align=”center” width=”one_half” lightbox=”true”]https://6mjxiq.dm1.livefilestore.com/y2psr4dxXTRnnBI6f_ukTjMjpImCHXwzKLpu2lYe2Y9ZbyY7buCEnSkbrJYlcqn9ihMnwS_T9vhnHFbgH2QywvCf9NUH4d45PiI856H9xbKMXU/20.png[/image]

在下面 Main class 中设置好程序的入口和参数

[image align=”center” width=”one_half” lightbox=”true”]https://k2vz5a.dm1.livefilestore.com/y2pLEyHGlF7r-VWRzg4VlhYYjC-SCE58Xy9Eq_uIfEO08KI4AuKGQ_ImkFKu_EfObVVgSir5FEOSiHkjlXrJ7WOb14LCIT9_M7sEzOy5USc23g/21.png[/image]

接着配置好 JRE 的参数

[image align=”center” width=”one_half” lightbox=”true”]https://6mgncw.dm2301.livefilestore.com/y2pAQ5Jruafj5rm3kl32bMSuscdQK5DHNG7siVAeXnmCa6yHF_8B2iVPHKZhdItzYgyWQF4UUYLLA-PycBG8Bws237_9aUy4lrFsjDGkISKmzA/22.png[/image]

高级选项里面 Serch sequence 和 Preferred VM 是设置 JRE 的查找顺序,可以用来定义程序使用的非使用者的JRE等设置。

[image align=”center” width=”one_half” lightbox=”true”]https://6mio5w.dm2301.livefilestore.com/y2petEE3WcdKdPmHtyc9tPS-_BMqP2Nh5p4i4QO06oh9D8iBEUbi_Lxw7_vFGCgd6-61leItmhmJxrtumJ84JfzHmCmbKmkZWkHYXuq5HnBFhQ/23.png[/image]

[image align=”center” width=”one_half” lightbox=”true”]https://k2vz5a.dm1.livefilestore.com/y2pUn8XXoM0Rmp88jzqhLzMlpXMWRg67Dlqs6uQb7IfXJVpzdy9o4WHVC-KO9zrh0EoDuEZQhL4G0U1khrj5c7MgWknPvKr6BuOqiqAI3vCRgA/24.png[/image]

Splash sceen 故名思意就是程序刚开始的闪屏

[image align=”center” width=”one_half” lightbox=”true”]https://k2vz5a.dm1.livefilestore.com/y2pxMY952QEJluP_IE16s8rgWceUM9dqXkMCDgMfhbzSnG3kaepLP9V3Bwt5e5FXpw6TvUl3Vdc1SdISBuaf-kQLxedGEgF0WVWBjzEx_F2YCw/25.png[/image]

[image align=”center” width=”one_half” lightbox=”true”]https://6mjjpw.dm1.livefilestore.com/y2pj09hQjBqk23wJvFJUqCYD02aNa8Z0heND_rJB_2BfgqmVendjqSuF40KufaLNAzAzrS63PiTp-ga3STj33atXHCMvgly04sCG8lefRvBqXk/26.png[/image]

Message 中主要包含程序消息、错误信息的国际化和自定义

[image align=”center” width=”one_half” lightbox=”true”]https://6mhkca.dm2301.livefilestore.com/y2pvsYyv3YEvP51DlujXmt47pfcOrBgVnW1IsHi37ycnDBKYuSch66myiqdNTrOwHWAWFGHNrU9YtSQfysv_14NPcgkure_lxTpW9AxrPT6fFs/27.png[/image]

万事具备,生成可执行文件:

[image align=”center” width=”one_half” lightbox=”true”]https://tqt5qq.dm2302.livefilestore.com/y2pxmlM21fhhraTR3YpbunxqVUd8O6HQA93yABmHqw1-y2ch6k-sF0hHsZYzDWw4uy5gc_ABUx6VVmYAQde8o7kBDW8HWflzwzJIdNYnrSJgu8/28.png[/image]

看到这一步,就说明生成成功了

[image align=”center” width=”one_half” lightbox=”true”]https://tqqv5w.dm2302.livefilestore.com/y2pw3ynVIDo4107ozxKowUoEzVXNEHg6cSMtZojhIjV01UkHFtvHOSM3VtGs19PIFSAvKgBU8arny4IR9OxTCVSH70f-Y1oxd6BWFMjWfUUPmY/29.png[/image]

运行一下看看效果:

[image align=”center” width=”one_half” lightbox=”true”]https://tqsucg.dm2302.livefilestore.com/y2plxjZ2d1MjBEcF3P43NMJAfgbrJ_PbJzMB6nVsOD9ZKfAk2jaNPkC3_dAZ5vRUS1aJoARmOyEKYECsgnd5mOMguQo-CSKdsFtdhGtmjCpFTs/30.png[/image]

从进程里也可以看出,运行的是 SwtDemo.exe,不再是 javaw.exe 了

留下一个答复

Please enter your comment!
Please enter your name here