首發!JDK14之jpackage命令嚐鮮

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 如下圖所示:

首發!JDK14之jpackage命令嚐鮮


如上圖,所示,主要是 requires , opens , exports 這三個關鍵字.

requires : 當前模塊想要運行的話,需要哪些依賴,相當於在maven引包的基礎上,要再聲明一遍依賴

opens: 當前模塊中的哪些包,可以被反射. 如fxml中要聲明處理的controller , 每當fxml加載的時候,都會去新建一個controller實例, 所以需要opens controller的包名給javafx.fxml

exports: 當前模塊有哪些包,可以被引用. 一般用於別的模塊依賴當前模塊的時候

jdk9及以後的打包方式

在jdk9及以後,打包方式,可以不侷限於打jar包,可以把jdk的這些模塊給一起用jlink打成一個鏡像.

如下我用gradle的jlink去打包

首發!JDK14之jpackage命令嚐鮮

最後的成果:

首發!JDK14之jpackage命令嚐鮮

如上所示, 會在build目錄,生成image鏡像文件夾,然後在其中有bin , conf, lib .然後用cmd運行bin目錄中的Sunflower就可以了, 如下所示: 記住這朵Sunflower , 我要讓他盛開在廣大java程序員的桌面,哈哈

首發!JDK14之jpackage命令嚐鮮

可以看到, 這時候除了程序主體存在,還有一個cmd窗口在這裡,何其不方便!!! 這時候, jdk13及以後的jpackage命令就派上用場了, 剛好我寫這個的時候, jdk14 early access 版本發佈了, 就直接拿jdk14做了實驗


JDK14的jpackage命令

在安裝好jdk14之後,可以使用jpackage -h 命令看下使用說明,如下圖所示

首發!JDK14之jpackage命令嚐鮮

其實這個是在上一部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函數名

運行後結果如下:

首發!JDK14之jpackage命令嚐鮮

最終如上圖,可以看到生成的dmg文件, 在mac上,進行安裝就可以使用了

首發!JDK14之jpackage命令嚐鮮

項目源碼

一.Sunflower應用還在開發中, 不久後會開放下載.

二. javafx+gradle應用: https://openjfx.io/openjfx-docs/#gradle

三. 項目所用到的判斷系統工具類,讀取/更改host工具類等開源地址如下:

https://github.com/xiaodaojava/sunshine

裡面還有很多很多常用的工具類.


分享到:


相關文章: