利用 exe4j 将 JAR 包制成免安装 JDK 的 EXE 文件
利用 exe4j 將 JAR 包制成免安裝 JDK 的 EXE 文件
- exe4j 的工作原理
- EXE 制作教程
??將 JAR 包制成能在 Windows 上直接運(yùn)行的 EXE 文件,是很多 Java 愛(ài)好者喜歡做的事情。雖然這不是對(duì) JAR 包的商業(yè)用法,不過(guò)很多人都希望能學(xué)以致用,而不僅僅是為了自己的職業(yè)生涯。有鑒于此,本文給出了將 JAR 包制成 EXE 文件的方法。為了避免降低使用該 EXE 文件的門檻,EXE 文件在運(yùn)行前最好還能免安裝 JDK,本文也給出了相應(yīng)的方法。不過(guò)即便如此,在具體使用之前,也有需要了解的事項(xiàng)。筆者在編寫這個(gè)教程之前,幾乎踩遍了所有常見(jiàn)的坑。如果讀者不想重蹈覆轍,還是仔細(xì)閱讀本文。
筆者的運(yùn)行環(huán)境:
-
JDK 11.0.12
-
exe4j 6.0.1
-
Windows 10 教育版
exe4j 的工作原理
??exe4j 這個(gè)軟件其實(shí)很傻瓜,很多人能可以自行制成 EXE,不過(guò)他們不清楚如何讓這個(gè) EXE 脫離本電腦的 JDK。實(shí)際上,exe4j 這個(gè)軟件所做的工作只是封裝 JAR 包并讓此 JAR 包鏈接 JRE。也就是說(shuō),此軟件并不能免除使用 JRE,并不能將 JDK 也一同封裝到 EXE 中,但是它可以指定 EXE 讀取 JRE 的方法。一般來(lái)說(shuō),如果沒(méi)有在 exe4j 中進(jìn)行這種指定,則生成的 EXE 將根據(jù)本 Windows 操作系統(tǒng)中關(guān)于 Java 的環(huán)境變量來(lái)尋找 JRE。如果進(jìn)行了這種指定,則生成的 EXE 將根據(jù)指定的相對(duì)路徑來(lái)尋找 JRE。也就是說(shuō),使用此軟件能夠完成的是,使一個(gè) Java 程序,原來(lái)需要通過(guò) JAR 包才能運(yùn)行,現(xiàn)在變成只需要一個(gè)文件夾中 EXE 文件與 JRE 文件即可運(yùn)行。此結(jié)果看起來(lái)不是完全令人滿意,但也基本滿足廣大使用者的要求。
??如果讀者想將 JDK 也一同封裝到 EXE 中,可以使用在本教程使用的 exe4j 的基礎(chǔ)上使用另一款軟件:Inno Setup。Inno Setup 有兩項(xiàng)功能:
當(dāng)程序的所有文件封裝成一個(gè) EXE 文件。
生成的 EXE 文件同時(shí)是一種含軟件安裝引導(dǎo)界面的安裝包。
但是,Inno Setup 只對(duì)本來(lái)就可以運(yùn)行的 EXE 有效。因此需要先使用在本教程的方法生成 EXE,然后再使用 Inno Setup 制作軟件安裝包。
EXE 制作教程
??下面開(kāi)始真正的教程。
需要一個(gè)可以在 CMD 中單獨(dú)運(yùn)行的 JAR 包。在 CMD 中運(yùn)行 JAR 包的方法是,使用命令:java -jar xxx.jar。
-
為了減少不必要的踩坑,建議不要使用多 JAR 依賴。如果讀者手上有關(guān)于 Java 程序的多個(gè)依賴 JAR 包,建議將其合成一個(gè) JAR 包。合成的方法有很多,可以借助 Java 的操作系統(tǒng)命令,也可以使用構(gòu)建工具,如 Maven。
-
如果讀者的 Java 程序是基于 Maven 的多模塊應(yīng)用,則將其打成一個(gè) JAR 包的方法,可見(jiàn)筆者的另一篇博客:
將 Maven 中的多模塊項(xiàng)目只打成一個(gè) JAR 包:
https://blog.csdn.net/wangpaiblog/article/details/119628194?spm=1001.2014.3001.5501
-
在安裝 exe4j 前,需要先安裝 JDK。在筆者編寫本教程的時(shí)候,exe4j 最高只支持 Java 11。因此如果讀者安裝的 Java 版本高于 exe4j 的要求,exe4j 的安裝將不會(huì)成功。
前面已經(jīng)講到,EXE 的運(yùn)行需要 JRE。如果希望生成的 EXE 能在其它計(jì)算機(jī)中運(yùn)行,則需要另行準(zhǔn)備 JRE。另外,Java 11 及以上的版本的安裝目錄中都沒(méi)有直接的 JRE。對(duì)于這種問(wèn)題,可以從下面的方法中選擇其中一種:
-
將 JDK 當(dāng)成 JRE 來(lái)使用,此時(shí),JDK 目錄就是 JRE 的目錄。之所以這樣可行,是因?yàn)?JRE 已經(jīng)被包含在 JDK 中了,不過(guò)缺點(diǎn)是 JDK 目錄所占空間很大,筆者可以衡量其中的利弊。
-
上面的方法會(huì)引入多余的依賴,造成軟件所占空間過(guò)于龐大。可以自行記錄自己的項(xiàng)目與依賴的 JDK,然后使用如下命令生成依賴:
jlink --strip-debug --compress 1 --no-header-files --no-man-pages --output miniJre --add-modules java.base,java.logging,java.naming,java.xml,jdk.sctp,jdk.unsupported,java.desktop -
生成 JRE 目錄。JRE 目錄所占大小一般是小于 JDK 目錄的,不過(guò)這種方法有很多弊端,生成的 JRE 目錄如果不是完整的,可能導(dǎo)致如下報(bào)錯(cuò):
java.lang.NoClassDefFoundError: java/util/logging/LogRecord at org.apache.commons.logging.LogAdapter$JavaUtilAdapter.createLog
生成 JRE 目錄的方法有很多,對(duì)于 Java 11,只需要在 Java 的安裝目錄的目錄 bin(如:C:\Program Files\Java\jdk-11.0.12\bin)下輸入命令:(如果 CMD 控制臺(tái)沒(méi)有管理員權(quán)限,需要先獲取管理員權(quán)限)
jlink.exe --module-path jmods --add-modules java.desktop --output jre
此時(shí)會(huì)生成一個(gè) JRE 目錄。完整的 JRE 目錄下應(yīng)該含有目錄 bin 等。需要將此 JRE 目錄移動(dòng)至其它地方保存,不要放在 Java 目錄下污染環(huán)境。exe4j 在安裝時(shí)會(huì)掃描 Java 的目錄,此過(guò)程生成的 JRE 目錄會(huì)對(duì) exe4j 形成干擾,導(dǎo)致其安裝失敗。
下載 exe4j。網(wǎng)址:https://exe4j.apponic.com/
安裝 exe4j 的過(guò)程很簡(jiǎn)單,這里從略。不過(guò)要注意,安裝 exe4j 之前要下載合適的 JDK。如果安裝的 JDK 版本過(guò)低或過(guò)高,則 exe4j 將無(wú)法啟動(dòng)。
準(zhǔn)備好以下的文件:
- 本項(xiàng)目的 JAR 包
- JRE 文件夾。如果把 JDK 目錄當(dāng)成 JRE 目錄,則需要拷貝整個(gè) Java 安裝目錄(如:C:\Program Files\Java\jdk-11.0.12)。Java 的安裝目錄下一般有目錄 bin 等。
- EXE 圖標(biāo)文件(此文件在制作完 EXE 之后就可以刪除,不過(guò)建設(shè)保留備用)
【注意】
- 如果不打算在本教程之后制作含安裝引導(dǎo)界面的 EXE 安裝包,則只需要將上述的這些文件放入同一個(gè)文件夾中。這樣做的話,就可以清楚地區(qū)分軟件的核心程序與通用的 JRE。
- 如果打算在本教程之后制作 含安裝引導(dǎo)界面的 EXE 安裝包,則需要將 本項(xiàng)目的 JAR 包 放入 JRE 文件夾 中。實(shí)際上,建議將所有的除 JRE 的文件全放入 JRE 文件夾`中。
打開(kāi) exe4j,填寫密鑰。筆者已經(jīng)事先有了密鑰,并保存在了本地文件夾。輸入密鑰之后就可以使用該軟件的后續(xù)功能了。
選擇將 JAR 包制成 EXE 模式。
設(shè)置應(yīng)用名與 EXE 的存放地址等信息。注意:請(qǐng)記住此 EXE 輸出地址,此地址將成為基地址。后面的 JRE 目錄等的地址,如果使用的是相對(duì)路徑,將使用該地址作為基地址。
此處很關(guān)鍵,關(guān)系到生成的 EXE 能不能脫離本操作系統(tǒng)。
-
如果不需要生成的 EXE 在其它計(jì)算機(jī)上可運(yùn)行,則此處可以直接點(diǎn)擊 Next。此時(shí),生成的 EXE 會(huì)根據(jù)本操作系統(tǒng)的環(huán)境變量來(lái)尋找 JRE。如果以后更改了相應(yīng)的環(huán)境變量,則此 EXE 文件那時(shí)可能會(huì)運(yùn)行失敗。
-
如果希望生成的 EXE 能在其它計(jì)算機(jī)中運(yùn)行,則需要進(jìn)行如下操作。
【踩坑提醒】
- 如果希望生成的 EXE 支持自由復(fù)制,則此處的路徑要使用相對(duì)路徑。這就是前面為什么要將相關(guān)文件放一起。
按下圖所示操作即可。
如果點(diǎn)擊上面的按鈕,應(yīng)用可以順序運(yùn)行,說(shuō)明前面的操作都已完整按筆者所指示的進(jìn)行。此時(shí),前面設(shè)置的 EXE 輸出目錄應(yīng)該有了相應(yīng)的 EXE 文件。
-
如果讀者前面沒(méi)有選擇自定義 JRE 目錄,則此 EXE 輸出目錄下的除 EXE 文件都可以刪去。
-
如果讀者前面選擇的是自定義 JRE 目錄,則只需保留的是 EXE 文件以及文件夾 JRE,且文件夾 JRE 與 EXE 文件的相對(duì)位置不能移動(dòng)(也就是說(shuō),需要且只需要將文件夾 JRE 與 EXE 文件放在同一個(gè)文件夾下即可)。除此之外,此 EXE 輸出目錄下的其它文件均可刪去。
最后,建議運(yùn)行此 EXE 來(lái)檢驗(yàn)一下本次生成 EXE 是否成功。
之后,如果想制作 含安裝引導(dǎo)界面的 EXE 安裝包,可以使用另一款軟件:Inno Setup。
總結(jié)
以上是生活随笔為你收集整理的利用 exe4j 将 JAR 包制成免安装 JDK 的 EXE 文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在 IntelliJ IDEA 中误添加
- 下一篇: 在 IntelliJ IDEA 中创建基