如何使Java项目生成可执行的exe文件

前言

前些天,有个朋友问我可否使用Java制作一个exe程序,要求运行程序可以实现某些功能。

我出于好奇了解了一下,是可以使用Java制作一些客户端exe程序的。

过程感觉还是比较有意思的,特此记录下来。

正文

因为这类程序一般都为客户端程序,涉及到较古老的JFrame,我就简单的使用一个例子来说明下。

我们比如说想制作一个读取文件大小的exe文件。

构建Java项目

我们首先构建一个普通的Java Maven项目,如下图。

upload successful

随便给项目起个名称。

upload successful

upload successful

这儿我们不需要任何maven依赖,如果项目较复杂可以引入需要的maven依赖等。

我们新建一个Frame实现文件读取大小功能。

upload successful

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class FileHelper extends JFrame implements ActionListener {
JButton open=null;
public static void main(String[] args) {
new FileHelper();
}
public FileHelper(){
open=new JButton("请选择要处理的文件");
this.add(open);
this.setBounds(400, 200, 1000, 500);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
open.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser jfc=new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
jfc.showDialog(new JLabel(), "选择");
File file=jfc.getSelectedFile();
if(file.isDirectory()){
JOptionPane.showMessageDialog(null, "请选择一个文件", "信息", JOptionPane.INFORMATION_MESSAGE);
}else if(file.isFile()){
if(file.canRead()){
long bytes = file.length();
String size = "";
if(bytes < 1024){
size = bytes + "B";
}else if(bytes < 1048576){
size = bytes/1024 + "KB";
}else{
size = bytes/1048576 + "MB";
}
String message = "该文件大小为:"+size + "\r\n文件路径:"+file.getPath();
JOptionPane.showMessageDialog(null, message, "信息", JOptionPane.INFORMATION_MESSAGE);
}else{
JOptionPane.showMessageDialog(null, "该文件不可读", "信息", JOptionPane.INFORMATION_MESSAGE);
}
}
}
}

我们运行一下,可以成功启动此项目。

upload successful

那我们如何将它转换为exe呢?

生成可执行jar文件

在生成exe之前,我们需要先生成可执行jar文件,再将jar文件转换成exe文件。

我们打开IDEA项目结构(File -> Project Structure -> Artifacts),如下:

upload successful

使项目可以生成一个可执行的jar包。

这儿要注意选择好项目和启动Main入口后,MANIFSET.MF一定到生成到src文件夹下。

upload successful

完成后会看到我们项目的一些信息,这儿我们配置生成的jar输出到项目目录out下,点击OK即可。

upload successful

这时候在项目src目录下可以看到META-INF文件夹及文件夹里的MANIFSET.MF文件,没有就说明配置错了。

在IDEA里找到 Build -> Build Artifacts,选择这个项目,点击Build。

upload successful

完成后会看到我们生成的jar包。

我们copy出来并使用Java运行一下。

1
java -jar framework-exe-app.jar

可以看到成功运行。

upload successful

显然我们只得到了一个只能在有JRT环境上运行的jar包,下一步我们来把它转成exe文件。

生成exe文件

将jar文件转换为exe文件,需要下载exe4j工具,exe4j

下载完成后安装,会打开welcome界面,这个界面是用来输注册码用的,如果不输入,是可以直接next进行下去的。但若是不输入,双击生成的exe时,会alert出一段话,如图。必须点“确定”才可以执行程序。

upload successful

upload successful

关于License Key,网上可以找到,这儿也提供了一些。

1
2
3
4
5
6
7
8
A-XVK258563F-1p4lv7mg7sav
A-XVK209982F-1y0i3h4ywx2h1
A-XVK267351F-dpurrhnyarva
A-XVK204432F-1kkoilo1jy2h3r
A-XVK246130F-1l7msieqiwqnq
A-XVK249554F-pllh351kcke50
A-XVK238729F-25yn13iea25i
A-XVK222711F-134h5ta8yxbm0

配置后,直接点击Next,选择”JAR” in “EXE” mode,如下图。

upload successful

点击Next,我们输入应用名(这儿我起名MyApp),然后文件输出路径我们新建一个文件夹,然后输出到这个文件夹下。

upload successful

点击Next,在这个页面我们需要配置名称,应用图标可配置可以不配置,如果应用不允许多开则需要勾选 Allow 那个选项。

upload successful

这儿在Advance Options里,还有一些其它可选项,有兴趣的童鞋可以自己看一下。

如果不想生成错误日志,可以去掉如图选项。

upload successful

这儿我们在这里面选中生成64-bit的应用程序。

upload successful

在第5步Java invocation页面,VM Parameters输入-Dappdir=${EXE4J_EXEDIR},然后我们将我们生成的jar包引入,如下图:

Class Path —> + —> Archive —> 选择jar包 —> OK

upload successful

然后配置我们的程序入口。

upload successful

点击Next,到达第6步,需要设置jre版本,如下图:

需要设置最小的jre版本,然后在Advance Options里,选择Search Sequence,我们设置使用自己的JRE,这样生成的应用程序可以在没有安装Java的系统上使用。

upload successful

在这之前,我们需要一份JRE(Java Runtime Environment)文件,可以在Java安装目录里找到,或者在官网上下载。比如 jre-8u231

将它复制到我们之前创建的MyApp目录里,在Search Sequence里选择它。(之前Search Sequence的默认的3个直接删除即可)。

upload successful

upload successful

点击Next,到达第7步,这儿是设置App启动图,可以不设置。

upload successful

第8步默认即可。

upload successful

点击Next,到达最后一步,可以点击Click Here to start Application按钮测试一下应用程序。

upload successful

upload successful

成功说明没有问题,点击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文件。

upload successful

upload successful

我们可以设置自己的App名字及一些基本信息。

upload successful

项目的安装路径,和是否允许用户更改安装路径参数设置我们直接取默认就好。

upload successful

找到我们刚生成的exe文件,然后添加必要文件(jre文件),注意需要将jre文件夹下的全部文件添加上。

PS: 这儿我们需要新建一个temp文件夹,将jre移动进来,然后选择temp,这样生成的MyApp.exe会和jre文件夹在同一级,不然MyApp.exe找不到JRE环境。

upload successful

upload successful

然后下一步,是配置应用图标创建显示的,如果允许用户不在桌面创建图标,可以如下配置:

upload successful

下一步关于License File 我们直接跳过就行。

upload successful

下一步是安装后使用者权限,我们默认安装后所有人都可以使用即可。

upload successful

下一步设置安装语言,用默认English即可。

upload successful

然后设置生成的文件路径,还有应用图标等。

upload successful

然后下一步到完成。

upload successful

编译时会问到是否保存编译脚本,依照自己选择即可。

编译效果图如下:

upload successful

最后会生成可安装的exe文件,我们运行下,把它安装一下。

我们安装完成可以看一下它的目录,其实和我们刚才的一模一样,只不过现在变成了一整个安装exe,而且安装包体积也被压缩了。

upload successful

总结

这篇文章没什么特别要总结的,主要就是相关工具的使用。

可以看到我们一个小小的功能,但生成的exe是巨大的,但是随着项目文件变多,jre占用比例减小,就是逐渐可以接受的了。

现在Java已经很少在桌面客户端进行一些开发工作了,但了解一下Java-exe的生成过程也是比较有意思的。

今天的内容就到这里吧。

源码

源码详见于我的 GitHub




-------------文章结束啦 ~\(≧▽≦)/~ 感谢您的阅读-------------

您的支持就是我创作的动力!

欢迎关注我的其它发布渠道