Jpackage-製作無需預裝Java環境的Jar可執行程序

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

  1. 創建 jar 文件

    jar cmf META-INF/MANIFEST.MF hello.jar Hello.class
    

    其中 c 表示創建新的歸檔文件,m 指定清單文件,f 指定生成的 jar 文件的名稱,最後是要添加到 jar 包中的文件列表。

  2. 執行 jar 文件

    java -jar hello.jar
    Hello
    
  3. 查看 jar 文件

    $ jar tf hello.jar
    META-INF/
    META-INF/MANIFEST.MF
    Hello.class
    

    其中 tlist,列出文件。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 的情況下運行。

參考

本文 Github.com/niumoo/JavaNotes倉庫已經收錄。
本文原發於網站:Jpackage - 製作無需預裝 Java 環境的 Jar 可執行程序
本文原發於公衆號:程序猿阿朗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章