前言
前些天,有个朋友问我可否使用Java制作一个exe程序,要求运行程序可以实现某些功能。
我出于好奇了解了一下,是可以使用Java制作一些客户端exe程序的。
过程感觉还是比较有意思的,特此记录下来。
正文
因为这类程序一般都为客户端程序,涉及到较古老的JFrame
,我就简单的使用一个例子来说明下。
我们比如说想制作一个读取文件大小的exe文件。
构建Java项目
我们首先构建一个普通的Java Maven项目,如下图。
随便给项目起个名称。
这儿我们不需要任何maven依赖,如果项目较复杂可以引入需要的maven依赖等。
我们新建一个Frame实现文件读取大小功能。
1 | public class FileHelper extends JFrame implements ActionListener { |
我们运行一下,可以成功启动此项目。
那我们如何将它转换为exe呢?
生成可执行jar文件
在生成exe之前,我们需要先生成可执行jar文件,再将jar文件转换成exe文件。
我们打开IDEA项目结构(File -> Project Structure -> Artifacts),如下:
使项目可以生成一个可执行的jar包。
这儿要注意选择好项目和启动Main入口后,MANIFSET.MF一定到生成到src文件夹下。
完成后会看到我们项目的一些信息,这儿我们配置生成的jar输出到项目目录out下,点击OK即可。
这时候在项目src目录下可以看到META-INF文件夹及文件夹里的MANIFSET.MF文件,没有就说明配置错了。
在IDEA里找到 Build -> Build Artifacts,选择这个项目,点击Build。
完成后会看到我们生成的jar包。
我们copy出来并使用Java运行一下。
1 | java -jar framework-exe-app.jar |
可以看到成功运行。
显然我们只得到了一个只能在有JRT环境上运行的jar包,下一步我们来把它转成exe文件。
生成exe文件
将jar文件转换为exe文件,需要下载exe4j工具,exe4j。
下载完成后安装,会打开welcome界面,这个界面是用来输注册码用的,如果不输入,是可以直接next进行下去的。但若是不输入,双击生成的exe时,会alert出一段话,如图。必须点“确定”才可以执行程序。
关于License Key,网上可以找到,这儿也提供了一些。
1 | A-XVK258563F-1p4lv7mg7sav |
配置后,直接点击Next,选择”JAR” in “EXE” mode,如下图。
点击Next,我们输入应用名(这儿我起名MyApp),然后文件输出路径我们新建一个文件夹,然后输出到这个文件夹下。
点击Next,在这个页面我们需要配置名称,应用图标可配置可以不配置,如果应用不允许多开则需要勾选 Allow 那个选项。
这儿在Advance Options里,还有一些其它可选项,有兴趣的童鞋可以自己看一下。
如果不想生成错误日志,可以去掉如图选项。
这儿我们在这里面选中生成64-bit的应用程序。
在第5步Java invocation页面,VM Parameters输入-Dappdir=${EXE4J_EXEDIR}
,然后我们将我们生成的jar包引入,如下图:
Class Path —> + —> Archive —> 选择jar包 —> OK
然后配置我们的程序入口。
点击Next,到达第6步,需要设置jre版本,如下图:
需要设置最小的jre版本,然后在Advance Options里,选择Search Sequence,我们设置使用自己的JRE,这样生成的应用程序可以在没有安装Java的系统上使用。
在这之前,我们需要一份JRE(Java Runtime Environment)文件,可以在Java安装目录里找到,或者在官网上下载。比如 jre-8u231。
将它复制到我们之前创建的MyApp目录里,在Search Sequence里选择它。(之前Search Sequence的默认的3个直接删除即可)。
点击Next,到达第7步,这儿是设置App启动图,可以不设置。
第8步默认即可。
点击Next,到达最后一步,可以点击Click Here to start Application
按钮测试一下应用程序。
成功说明没有问题,点击Exit
按钮即可。
最后它会问你要不要保存配置信息,保存的话可以下次使用这个配置,这个按自己需要来即可。
退出后我们在我们的MyApp文件夹下可以找到刚才生成的App,可以运行一下是没有问题的。
一些问题
我们虽然制作完成了该App,可是我们发现,我们把应用程序exe文件单独移动到一个地方,运行时,就会报找不到JRE环境。
这是比较容易理解的,我们使用Java编译的class文件,最终转换成了exe文件,但是仍不能离开JRE环境运行,也就是需要将整个MyApp文件夹进行移动,或者作为一个项目(App)。
这显然和在一台机器上安装JRE没有本质区别……
就是变成了我们使用了项目自带的JRE环境。
这也是没有办法的事,因为Java的平台无关性,就是基于它的JRE环境,脱离JRE环境也无法运行class文件,我们的exe其实只是一层包装而已。
可安装版本的exe文件
即使是一层包装,能不能使它在优化下呢?起码别人一看起来不立马觉得别扭?
其实我们可以继续对exe文件和jre部分继续进行包装,使它成为一个安装版本的可执行文件。
这儿我们需要使用到 Inno Setup,这儿我们可以下载它 Inno Setup Downloads
下载安装完成(过程略)后打开,如下图:
我们选择使用生成向导来一步步引导我们生成exe文件。
我们可以设置自己的App名字及一些基本信息。
项目的安装路径,和是否允许用户更改安装路径参数设置我们直接取默认就好。
找到我们刚生成的exe文件,然后添加必要文件(jre文件),注意需要将jre文件夹下的全部文件添加上。
PS: 这儿我们需要新建一个temp文件夹,将jre移动进来,然后选择temp,这样生成的MyApp.exe会和jre文件夹在同一级,不然MyApp.exe找不到JRE环境。
然后下一步,是配置应用图标创建显示的,如果允许用户不在桌面创建图标,可以如下配置:
下一步关于License File 我们直接跳过就行。
下一步是安装后使用者权限,我们默认安装后所有人都可以使用即可。
下一步设置安装语言,用默认English即可。
然后设置生成的文件路径,还有应用图标等。
然后下一步到完成。
编译时会问到是否保存编译脚本,依照自己选择即可。
编译效果图如下:
最后会生成可安装的exe文件,我们运行下,把它安装一下。
我们安装完成可以看一下它的目录,其实和我们刚才的一模一样,只不过现在变成了一整个安装exe,而且安装包体积也被压缩了。
总结
这篇文章没什么特别要总结的,主要就是相关工具的使用。
可以看到我们一个小小的功能,但生成的exe是巨大的,但是随着项目文件变多,jre占用比例减小,就是逐渐可以接受的了。
现在Java已经很少在桌面客户端进行一些开发工作了,但了解一下Java-exe的生成过程也是比较有意思的。
今天的内容就到这里吧。
源码
源码详见于我的 GitHub