jpackage命令使用場景
使用場景是面向java桌面端程序打包. 可以讓windows/mac 直接雙擊使用java程序,對系統裡面有沒有jdk/jre不做要求.
在這裡,我們先理一下以前java桌面程序是怎麼運行的:
jdk8及以前
這時候的java客戶端程序,主要分兩部分, 一部分是可執行jar包, 一部分是電腦裡面要裝jdk/jre , 然後通過
java -jar XXXXX.jar 來運行程序.
jdk9及以後的模塊化
這是java模塊化的一個分界線,其實jdk9,jdk10,我都沒有用過, 我是直接嘗試的jdk11. 在模塊化的基礎上, 項目多了一個文件, moudle-info.java 如下圖所示:
如上圖,所示,主要是 requires , opens , exports 這三個關鍵字.
requires : 當前模塊想要運行的話,需要哪些依賴,相當於在maven引包的基礎上,要再聲明一遍依賴
opens: 當前模塊中的哪些包,可以被反射. 如fxml中要聲明處理的controller , 每當fxml加載的時候,都會去新建一個controller實例, 所以需要opens controller的包名給javafx.fxml
exports: 當前模塊有哪些包,可以被引用. 一般用於別的模塊依賴當前模塊的時候
jdk9及以後的打包方式
在jdk9及以後,打包方式,可以不侷限於打jar包,可以把jdk的這些模塊給一起用jlink打成一個鏡像.
如下我用gradle的jlink去打包
最後的成果:
如上所示, 會在build目錄,生成image鏡像文件夾,然後在其中有bin , conf, lib .然後用cmd運行bin目錄中的Sunflower就可以了, 如下所示: 記住這朵Sunflower , 我要讓他盛開在廣大java程序員的桌面,哈哈
可以看到, 這時候除了程序主體存在,還有一個cmd窗口在這裡,何其不方便!!! 這時候, jdk13及以後的jpackage命令就派上用場了, 剛好我寫這個的時候, jdk14 early access 版本發佈了, 就直接拿jdk14做了實驗
JDK14的jpackage命令
在安裝好jdk14之後,可以使用jpackage -h 命令看下使用說明,如下圖所示
其實這個是在上一部jlink有鏡像之後,對鏡像做了一層封裝.
我最後實驗成功的打包命令是:
<code>/Users/lixiang/soft/jdk-14.jdk/Contents/Home/bin/jpackage --runtime-image image --type dmg --name Sunflower --module red.lixiang.tools.desktopmain/com.platform.tools.desktop.DesktopMain/<code>
--runtime-image 後面跟的是文件夾, 就是我們build目錄下的image文件夾
--type 打成什麼樣的包, 在mac系統中有 app-image , dmg , pkg三個選項, windows的我沒試,應該是有exe選項
--name 軟件的名字, 這裡是Sunflower(向日葵)
--moudle 模塊的名字,相當於以前的Main函數的格式,這裡換成了模塊 '包名'/Main函數名
運行後結果如下:
最終如上圖,可以看到生成的dmg文件, 在mac上,進行安裝就可以使用了
項目源碼
一.Sunflower應用還在開發中, 不久後會開放下載.
二. javafx+gradle應用: https://openjfx.io/openjfx-docs/#gradle
三. 項目所用到的判斷系統工具類,讀取/更改host工具類等開源地址如下:
https://github.com/xiaodaojava/sunshine
裡面還有很多很多常用的工具類.
閱讀更多 Java高級架構師 的文章