使用jpackage將java程序打包成exe程序(不需要安裝jdk即可運行)


 
前言
突然想到把java打包成windows上可以運行的程序,於是乎,在搜索引擎和各路博客以及官方文檔的幫助下,終於實現了目標,雖然不算完美,但在這個過程中對maven打包過程,jdk打包jar的理解加深。
maven只是更方便的幫助我們打包的工具,於是開始嘗試直接使用jdk打包。
接着嘗試使用maven打包,再使用jpackage打包成exe安裝包。
然后又希望打包成綠色版的exe(就是無需安裝直接運行的),結果打包完發現文件太大,而且每次修改都要打包,時間太長。
嘗試直接使用編譯好的class運行java程序,修改完類就可以直接替換,無需打jar包和再次轉成exe。
過程中又發現jpackage打包的整個文件有很多重復的dll文件,又發現了runtime文件夾。
想到使用jre可以直接運行java程序,又發現這些dll和jre中的文件高度重合,於是想到直接將jre和class直接打包到一起,使用腳本命令來啟動java程序。
這樣又使整個運行所需的文件夾大小直接減小了幾十MB,打包文件從最開始的200+MB,最終縮小到了 70MB,哎,就是玩兒。
 
1.安裝wix 3.XX
下載地址:
Release WiX Toolset v3.11.2 · wixtoolset/wix3 · GitHub
https://github.com/wixtoolset/wix3/releases
下載二進制包(wix311-binaries.zip)解壓並添加根目錄路徑到環境變量path中(D:\Program\openjdk\wix)
 
2.打包成便攜執行程序( https://ravenxrz.ink/archives/421e5ad2.html)
目錄結構
在空白處按住shift,單擊右鍵,選擇“在此處打開powershell窗口”
執行
.\jdk-14.0.1\bin\jpackage -i .\planewar --type app-image -n planewar --main-jar .\planewar\plane-war-1.0-SNAPSHOT.jar --vendor cy --verbose --win-console
選項說明:
# -i: 存放待打包資源的文件夾
# -type: win下默認是exe,其他的有msi、app-image
# -n: 打包后的程序名稱
# --main-jar 包含啟動類(main)的jar包,如果jar包不是可執行的jar,則需要手動指定主類
# --main-class 手動指定主類,例如: --main-class com.xxx.AppMain
# --vendor 供應商信息(隨便填)
# --verbose 顯示打包過程
# --win-console 添加控制台輸出

 

3.打包成安裝程序
將需要打包的資源放進文件夾planewar
執行打包
.\jdk-14.0.1\bin\jpackage -i .\planewar -n planewar --main-jar .\planewar\plane-war-1.0-SNAPSHOT.jar --vendor cy --verbose --win-console --win-dir-chooser --win-shortcut
選項說明:
# -i 表示輸入文件夾
# -n 表示應用名稱
# --main-jar 指定jar包,需要jar已經指定main類,否則需要添加--main-class手動指定,如:--main-class com.demo.DemoApplication
# --vendor 發行商信息
# --verbose 顯示打包執行過程
# --win-console 使用控制台輸出
# --win-dir-chooser 選擇安裝位置
# --win-shortcut 創建快捷方式
#其他的選項如下:
# –win-dir-chooser, 安裝時添加 “選擇安裝路路徑”
# –win-shortcut, 安裝后自動在桌面添加快捷鍵
# –win-menu-group, 啟動該應用程序所在的菜單組 (實測無效,但是必須有這條命令,沒有–win-menu 會報 311 錯誤)
# -update 2021-2-18: –win-menu-group 應該放在–win-menu 之后,否則無效。
# –win-menu,添加到系統菜單中
# 示例:jpackage --name Non-modular-installer --input lib --main-class com.raven.App --main-jar Non-modular-packaging-demo.jar --vendor raven --win-dir-chooser --win-shortcut --win-menu --win-menu-group "Non-modular-packaging"

 

4.在便攜包(步驟2或其他類型包的安裝目錄)的基礎上直接使用類運行程序,不使用jar包
  4.1 打開"軟件目錄(或安裝目錄)/app"文件夾
  4.2 使用文本編輯器打開"軟件名.cfg"(例如:PlaneWar.cfg)文件並修改
修改前
 
[Application]
app.name=PlaneWar
app.version=1.0
app.runtime=$ROOTDIR\runtime
app.identifier=com.game
app.classpath=$ROOTDIR\app\.\plane-war-1.0-SNAPSHOT.jar;$ROOTDIR\app\plane-war-1.0-SNAPSHOT.jar
app.mainjar=$ROOTDIR\app\plane-war-1.0-SNAPSHOT.jar
app.mainclass=com.game.World

[JavaOptions]

[ArgOptions]

 

修改后:
刪除了"app.mainjar"項
修改"app.classpath"為app文件所在路徑(即cfg文件夾路徑),其他保持不變
[Application]
app.name=PlaneWar
app.version=1.0
app.runtime=$ROOTDIR\runtime
app.identifier=com.game
app.classpath=$ROOTDIR\app
app.mainclass=com.game.World

[JavaOptions]

[ArgOptions]

 

5.直接使用windows的bat腳本或linux腳本運行java程序(自帶運行環境)
5.1 將java代碼相關資源放入app文件夾
5.2 生成jre運行環境(注意jdk版本需要和代碼版本一致,否則可能會出錯)
進入jdk根目錄
輸入(如果失敗,嘗試使用管理員身份啟動powershell,再執行該命令)
bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre
生成后的jre文件夾如圖
5.3 powershell手動執行命令驗證是否成功
jre\bin\java --class-path "..\planewar\PlaneWar\app\.;..\planewar\PlaneWar\app\lib\*" com.game.GameLaunch

 說明:

# 成功表示可以運行
# jar路徑windows使用";"分割,linux使用""
# "..\planewar\PlaneWar\app\."表示class文件的根目錄
# "..\planewar\PlaneWar\app\lib\*"表示加載lib中所有的jar文件

 

5.4
創建一個新文件夾
將jre文件夾和app文件夾移入新文件夾中
根據你的系統選擇下列一種即可
Windows:
創建文本文件,重命名為run.bat,內容輸入:
jre\bin\java --class-path "app\.;app\lib\*" com.game.GameLaunch

 Linux:

創建文本文件,重命名為run.sh,內容輸入:
jre\bin\java --class-path "app\.:app\lib\*" com.game.GameLaunch

5.5 運行腳本,成功即完成。

 
參考:
https://blog.csdn.net/qq_38373149/article/details/115201261
https://blog.csdn.net/yiminghd2861/article/details/108286956
以及其他博客(寫的時候沒記錄下網址)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM