JAR 包要在預裝 JRE 環境的系統上執行。如果沒有預先安裝 JRE 環境,又想直接執行 Java 程式,該怎麼辦呢?
這篇文章我們會先學習如何將 Java 程式打包成一個可執行的 Java JAR 檔案。然後演示如何使用這個 JAR 檔案生成 Windows、Linux、MacOS 上的可執行程式。 我們將使用 Java 自帶的 jar
命令列工具來建立 JAR 檔案。然後學會使用 jpackage
工具建立各個系統上的可執行程式。
注意:jpackage 工具從 Java 14 版本開始提供的,可以用來生成可執行程式。
什麼是 jar
jar 檔案是一個包含編譯後的 Java Class 檔案和其他資源的容器。它基於廣泛使用的 ZIP 檔案格式,因此 jar 檔案可以使用 ZIP解壓縮工具解壓。 一個可執行的 jar 檔案需要包含一個 main 類作為程式的入口,並在 MANIFEST.MF
檔案中指定
但是為了執行 jar 格式的應用程式,必須有一個Java 執行時環境(JRE)。
jar 命令
Java 的 jar
命令是 Java Archive Tool,它是一個用於建立、檢視和管理 jar 檔案的命令列工具。此工具包含在 JDK 中。
詳細介紹 jar
命令的使用不是本文目的,下面給出 jar
命令的常見用法。
建立一個輸出 Hello
的Java 類用於測試。
目錄結構:
├── Hello.java
└── META-INF
└── MANIFEST.MF
檢視檔案內容然後編譯 Hello.java
public class Hello{
public static void main(String[] args) throws InterruptedException{
System.out.println("Hello");
// 3s 後退出
Thread.sleep(3 * 1000);
}
}
// 編譯:javac Hello.java
配置 MANIFEST.MF
檔案,注意,最後一定要有一個換行,否則可能在 Windows 上執行失敗。
Manifest-Version: 1.0
Main-Class: Hello
-
建立 jar 檔案
jar cmf META-INF/MANIFEST.MF hello.jar Hello.class
其中
c
表示建立新的歸檔檔案,m
指定清單檔案,f
指定生成的 jar 檔案的名稱,最後是要新增到 jar 包中的檔案列表。 -
執行 jar 檔案
java -jar hello.jar Hello
-
檢視 jar 檔案
$ jar tf hello.jar META-INF/ META-INF/MANIFEST.MF Hello.class
其中
t
為list
,列出檔案。f
指定 jar 檔案。
建立 jar 檔案有多種方式,比如藉助 Maven 或者 Gradle 工具都可以打包 Java 程式為 jar 檔案,而且更加方便。比如 Spring Boot 開發過程中, mvn package
即可生成 jar 檔案。
jpackage 命令
jpackage
命令是從 Java 14 開始提供的,可以幫助我們為模組化或非模組化 Java 應用程式生成指定系統平臺的可執行程式,而不用預先安裝 JRE 環境。如何做到的呢?
我們知道 Java 程式必須在 JRE環境才能執行, jpackage
其實是把 JRE 和 JAR 檔案以及所有必要依賴項一起打包生成指定平臺的可執行程式。例如 Windows 上的 exe 或 macOS 上的 dmg。每種格式都必須構建在其執行的平臺上,沒有跨平臺支援。工具還提供了常見的自定義操作,如應用名,應用圖示等。
檢視 jpackage
幫助:
jpackage --help
用法:jpackage <options>
示例用法:
--------------
生成適合主機系統的應用程式包:
對於模組化應用程式:
jpackage -n name -p modulePath -m moduleName/className
對於非模組化應用程式:
jpackage -i inputDir -n name \
--main-class className --main-jar myJar.jar
從預構建的應用程式映像:
jpackage -n name --app-image appImageDir
生成應用程式映像:
對於模組化應用程式:
jpackage --type app-image -n name -p modulePath \
-m moduleName/className
對於非模組化應用程式:
jpackage --type app-image -i inputDir -n name \
--main-class className --main-jar myJar.jar
要為 jlink 提供您自己的選項,請單獨執行 jlink:
jlink --output appRuntimeImage -p modulePath \
--add-modules moduleName \
--no-header-files [<additional jlink options>...]
jpackage --type app-image -n name \
-m moduleName/className --runtime-image appRuntimeImage
生成 Java 執行時程式包:
jpackage -n name --runtime-image <runtime-image>
對預定義應用程式映像進行簽名:
jpackage --type app-image --app-image <app-image> \
--mac-sign [<additional signing options>...]
注:此模式下允許的其他選項只有:
一組其他 mac 簽名選項和 --verbose
........
jpackage 建立可執行檔案
建立可執行程式命令格式:
jpackage --input . --name YouAppName --main-jar youfile.jar
現在讓我們使用上面的 hello.jar
來建立一個可執行的JAR檔案。hello.jar
直接執行會輸出 Hello
字元。
Windows 平臺
注意: 對於 Windows,
jpackage
需要 WiX 3.0 或更高版本。Winx3.14 下載:https://github.com/wixtoolset/wix3/releases/tag/wix314rtm
由於 hello.jar
是一個命令列程式,沒有 UI介面,因此打包時使用 --win-console
引數配置以命令列方式啟動。
常見的 Windows 下 jpackage
引數還有:
- --type : 指定打包後的格式,如 msi、exe,預設 exe。
- --win-console:使用控制檯視窗啟動我們的應用程式
- --win-shortcut : 在 Windows 開始選單中建立快捷方式檔案
- --win-dir-chooser:讓終端使用者指定自定義目錄來安裝可執行檔案
打包成 exe 程式。
jpackage --input . --name helloApp1 --win-console --win-shortcut --main-jar hello.jar
打包後可以得到 helloApp1-1.0.exe
檔案。
PS C:\Users\Administrator\Desktop\test> jpackage --input . --name helloApp --win-console --win-shortcut --main-jar hello.jar
PS C:\Users\Administrator\Desktop\test> ls
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/3/7 22:14 526 Hello.class
-a---- 2024/3/7 22:14 802 hello.jar
-a---- 2024/3/7 22:13 208 Hello.java
-a---- 2024/3/7 22:17 110145536 helloApp1-1.0.exe
-a---- 2024/3/7 21:58 42 MANIFEST.MF
直接雙擊執行安裝。
安裝完成後,桌面上會出現圖示,雙擊可以執行並輸出 Hello
字串。
Mac 平臺
Mac 平臺執行 jpackage
命令會自動生成 dmg 安裝包。
jpackage --input . --name hello --main-jar hello.jar
生成 hello-1.0.dmg
檔案,雙擊彈出安裝介面。
因為測試程式 hello.jar
是一個輸出 Hello
字串的命令列程式,並沒有 UI,因此測試從命令列啟動檢視輸出。
➜ ~ /Applications/hello.app/Contents/MacOS/hello
Hello
Linux 平臺
jpackage --input . --name hello --main-jar hello.jar
我所在 Linux 系統為 Ubuntu22
,所以生成安裝包 hello_1.0_amd64.deb
。
$ ls -l -h
total 37M
-rw-r--r-- 1 root root 37M Mar 7 16:50 hello_1.0_amd64.deb
-rw-r--r-- 1 root root 401 Mar 6 11:42 Hello.class
-rw-r--r-- 1 root root 1.1K Mar 7 16:42 hello.jar
-rw-r--r-- 1 root root 96 Mar 6 11:41 Hello.java
-rw-r--r-- 1 root root 41 Mar 6 11:42 MANIFEST.MF
安裝 hello_1.0_amd64.deb
。
$ apt install hello_1.0_amd64.deb
安裝後命令位於 /opt
目錄下,執行測試:
$ /opt/hello/bin/hello
Hello
總結
本文介紹了在沒有預裝 JRE 環境的系統上執行 Java 程式的方法。首先,介紹如何使用 Java 的 jar
命令列工具建立一個可執行的 JAR 檔案,這需要編寫 Java 程式,配置 MANIFEST.MF
檔案,並使用 jar
命令建立包含主類的 JAR 檔案。接著,介紹了 jpackage
工具(從 Java 14 版本開始提供),該工具可以打包 JAR 檔案和必要的 JRE 環境,生成適用於 Windows、Linux、MacOS 的可執行程式,使得 Java 應用程式能夠在無需預裝 JRE 的情況下執行。
參考
-
https://docs.oracle.com/en/java/javase/21/jpackage/
-
https://docs.oracle.com/en/java/javase/21/docs/specs/man/jpackage.html
本文 Github.com/niumoo/JavaNotes倉庫已經收錄。
本文原發於網站:Jpackage - 製作無需預裝 Java 環境的 Jar 可執行程式
本文原發於公眾號:程式猿阿朗