前言
突然想到把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)
( 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
以及其他博客(寫的時候沒記錄下網址)