Java程序打包可执行jar及exe

发布于 2020-03-26  222 次阅读


[infobox title="介绍"]

之前因为助课的老师让我的一个同学查一下如何把写好的Java程序打包成可执行文件好给学生进行讲课。然后那位同学找到了我,向我咨询。我又进行了一番查找去给他讲。。。中间商赚差价

我先陈述一下我的环境:Java14、IntelliJ IDEA Ultimate 2020.1 BETA、exe4j 7.0。

本人有更新强迫症,所以环境都是最新的。(新版软件系统的受害者

[/infobox]

[successbox title="打包Jar"]

首先,我们需要先把Java程序打包成jar包。这里我用IntelliJ IDEA Ultimate进行演示。

1. 打开项目结构设置,选择好Project SDK(项目所用的jdk)版本以及Project langurage level(项目语言版本)。

2. 点击Artifacts,添加jar配置。

3. 选择Main Class主类,勾选copy to the output directory and link via manifest,选择好MANIFEST.MF文件的创建路径,切记按以上步骤去做,否则有可能在打jar包时,jar包不包含MANIFEST.MF文件,最终导致jar包在运行时可能会抛出找不到主类的异常。

4. 全部单击确定后,单击菜单栏的Build(构建)下的 Build Artifacts,在弹出的菜单中选择Build或者Rebuild。

5. 在out/artifacs目录下便会生成一个jar文件。设置好系统的Java环境变量便可以做到双击jar文件运行程序。

[/successbox]

[successbox title="Jar转换exe"]

Jar转换exe的软件有很多,但一部分都是收费的商业化软件,例如exe4j等。也有自带的例如Java14 自带的jpackage、Java9 自带的jaot和Java8 自带的javapackager。

我个人是用的exe4j(白嫖)以下的转换方法也是基于exe4j。

1. 打开exe4j,显示欢迎界面。

2. 单击Next,选择"JAR in EXE" mode模式。

3. 输入你的应用名称(自定义)以及exe输出文件夹。

3. 选择可执行程序的类型、生成.exe文件名、应用图标(可选)等

PS:

可执行程序类型解释:

GUI application(图形化界面程序,勾选Allow -console parameter则会在显示图形界面的同时显示CMD控制台)

Console application(控制台程序)

Service(服务程序独立于登录用户运行,即使没有用户登录,也可以运行。服务不能依赖于控制台的存在,也不能打开窗口。)

可选项:

Icon File(应用图标)

Allow only a single running instance of the application(生成的可执行文件只能启动一次。后续用户调用将使应用程序处于前台)

Fail if an exception in the main thread is thrown(生成的可执行文件可以监视主方法是否引发异常,并在这种情况下显示错误对话框)

Change working directory to(对于某些应用程序,您可能希望将工作目录更改为相对于可执行文件的特定目录,例如读取位于固定位置的配置文件)

PSS:由于本案例使用的是一个有图形化界面的贪吃蛇游戏程序,所以将按照图形化界面程序进行选择。

4. 单击Advanced Options显示更多选项,选择下拉菜单内的32-bit or 64-bit,对可执行文件进行32位或64位选择(以jdk环境位数为准)。这里我使用的是jdk14 64-bit。

勾选Generate 64-bit executable即可。

5. 单击Next,进入到Configure options for the executable manifest。

第一组选项Execution Level是exe文件执行权限的设置:

As invoker(默认设置,执行文件将使用当前令牌的权限执行)

Highest available(此级别将提高可执行文件的权限,以最大程度提供给当前用户)

Require administrator(当用户使用筛选令牌运行的管理员时,这与"最高可用"相同。如果用户是标准用户,Windows 将请求管理员帐户的凭据)

第二组选项DPI Awareness是exe的图形化DPI设置。对于没有高 DPI 感知的启动器,其 GUI 中的像素将放大。除非缩放设置为 100% 的倍数,否则通常看起来模糊不清:

Always(启动器显示的 GUI 是 DPI 感知并正确缩放)

Never(启动器显示的 GUI 不知道 DPI,需要由 Windows 缩放)

Java 9+(对于 Java 9 或更高版本,AWT/Swing 中的基本高 DPI 处理对于大多数应用程序是可接受的,因此,如果项目的最小 Java 版本至少为 Java 9,此选项将激活它。)

PS:这里由于我的程序只是一个游戏程序,所以并不需要特别高的运行权限。其次,由于我的Java构建版本是14,所以DPI选项需要选择Java 9+。

6. 单击Next,进入到Configure Java invocation,配置VM虚拟机参数、jar包、主类等。

PS:配置项说明:

VM Parameters:VM参数表。

Main class from:选择所选jar包的主类。

Arguments for main class:输入由空格分隔的主类的参数列表。命令行上的参数将追加到固定参数。

首先我们需要选择jar包,点击右侧+,选择我们要转换的jar包。

然后选择jar包中的主类。

7. 单击Next,进入到Configure JRE页面。

PS:配置项说明:

Minimum version:JRE最小支持版本

Maximum version:JRE最大支持版本

Allow JREs with a beta version number:默认情况下,具有测试版号或早期访问发布周期的 JREs 不会由启动器使用。如果要启用这些 JREs 的使用,请选择此选项。

Only allow JDKs and no JREs:仅允许JDK,而不是JRE。

此处需要注意!!!Java在JDK11及其之后的版本,默认不单独提供JRE,需要在JDK目录下敲一下命令手动生成!!!

[block]

 .\bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre

[/block]

 

如果你直接使用JDK进行打包,切记不要选择此项。会报错。原因暂时不详!!!

如果你直接使用JDK进行打包,切记不要选择此项。会报错。原因暂时不详!!!

如果你直接使用JDK进行打包,切记不要选择此项。会报错。原因暂时不详!!!

如果你使用JDK11版本以下,或者是JDK11以上且手动生成的独立JRE包则可以选择此项!!!

这里我使用的是JDK14,不手动生成JRE。

8. 选择完配置后,单击Advanced Options下拉菜单,选择Search sequrence。进入到JRE or JDK环境导入页面。

这里我们需要注意的是我们要转换的jar包需要与我们要导入的JDK or JRE文件夹位于同目录下。我们可以将我们的JDK or JRE文件夹复制一份到要转换的jar包所在目录下。

然后我们要将Search sequence下面的所有选项删除如下图所示:

然后,我们单击+,添加我们要导入的JDK or JRE目录。

9. 单击Next,进入到Choose the preferred VM页面。

PS:配置说明;

选择要启动应用程序的预置 JVM。这不是绝对保证所选 JVM 将实际使用,并且如果 JVM 不可用,也不会导致错误。

Default VM:默认JVM。

Client hotspot VM:这相当于在从命令行调用 java 时使用 -client选项。

Server hotspot VM:这相当于在从命令行调用 java 时使用 -server 选项

这里我选择的是Default VM。

10. 单击多次Next或直接单击Finish即可开始转换exe可执行程序。

下图为生成中的页面。

11. 生成完毕后,便会在输出目录看见我们生成的exe可执行程序,同时exe4j显示以下页面。

PS:这里我们需要注意一点,生成的exe可执行程序需要与我们刚才导入的JDK or JRE文件夹在同一目录下方可执行,否则会报错。我们也可以在日后使用NSIS等安装包制作工具将其打包成安装包。

[/successbox]

[infobox title="总结"]

至此,jar转换exe就算是结束了。exe4j这个软件对于Java版本有一定的要求,有时会因为版本问题产生一些错误。但目前为止,它是比较方便的解决方案之一。日后如果有更好的解决方案我也会及时分享给大家。感谢大家的观看,小白一枚如有不足或者错误还请多多指教。

[/infobox]