jpackage in Java 14 jpackage is a command-line tool to create native installers and packages for Java applications. Install OpenJDK 14 On Ubuntu 20.04/18.04 curl -O https://download.java.net/java/GA/jdk14/076bab302c7b4508975440c56f6cc26a/36/GPL/openjdk-14_linux-x64_bin.tar.gz tar xvf openjdk-14_linux-x64_bin.tar.gz mv jdk-14 $HOME/opt/ On MacDownload: https://jdk.java.net/14/ cd ~/Downloads tar xf openjdk-14_osx-x64_bin.tar.gz sudo mv jdk-14.jdk /Library/Java/JavaVirtualMachines/ java -version Packing JAR as .deb/.dmg 將可以直接執行的單一 jar 檔封裝成 Debin-based 安裝檔。 mkdir {icons,input,output,temp} tree -L 3 --dirsfirst --filelimit 10 --sort=name . ├── icons │ └── CloudCoin_Wallet-Dark.png ├── input │ └── CloudCoin.D.3.0.15.jar ├── output │ ├── CloudCoin_Wallet-Dark │ │ ├── bin │ │ └── lib │ └── cloudcoin-wallet-dark_3.0.15-1_amd64.deb ├── temp ├── build.sh └── license.txt 7 directories, 5 files 檔案目錄說明: icons: App 的圖示檔(*.png), size 256x256 input: 原始的 jar 檔 output: 封裝後的 .deb 檔案 temp: 封裝過程中會用到的暫存檔 build.sh: 封裝啟動檔 license.txt: App 的使用授權宣告 build.sh for deb: export PATH="$PATH:~/opt/jdk-14/bin" [ -d temp ] && rm -rf temp/* jpackage \ --type deb \ --name CloudCoin_Wallet-Dark \ --description "CloudCoin Wallet - Dark Edition. Homepage: https//cloudcoin.global." \ --vendor "CloudCoin Consortium" \ --app-version 3.0.15 \ --input input --dest output --temp temp \ --icon icons/CloudCoin_Wallet-Dark.png \ --license-file license.txt \ --copyright "CloudCoin™ Global Consortium © 2020 The Future of Currency" \ --main-jar CloudCoin.D.3.0.15.jar \ --linux-deb-maintainer alang.hsu@gmail.com \ --linux-app-category misc \ --linux-shortcut PATH:JDK 14 的安裝目錄,也就是 jpackage 的儲存目錄。 第 3 行:每次封裝前,先清除目錄 temp。 --type:封裝檔的類型。 --name:應用程式名稱。 --description:應用程式更多描述。 --vendor:來源製造商。 --input:input 目錄路徑。 --dest:output 目錄路徑。 --temp:temp 目錄路徑。 --icon:App 圖示檔路徑。 --license-file:使用授權宣告檔。 --main-jar:原始 jar 檔名。 --linux-deb-maintainer:維護者名稱。 --linux-app-category:應用程式類型。 --linux-shortcut:建立應用程式啟動檔。 build.sh for dmg: export PATH="$PATH:/Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home/bin" [ -d temp ] && rm -rf temp/* jpackage \ --type dmg \ --name CloudCoin_Wallet-Dark \ --main-jar CloudCoin.D.3.0.22.jar \ --input input --dest output --temp temp \ --app-version 3.0.22 \ --icon icons/CloudCoin_Wallet-Dark.icns \ --vendor "CloudCoin Consortium" 開始封裝 bash build.sh 封裝完成的安裝檔(.deb,.dmg)會儲存在目錄 output。 封裝後的 DMG 檔並沒有經過 Mac 軟體的簽署,安裝時必須先手動執行指令。 安裝沒有簽署的 DMG sudo spctl --master-disable # Install the DMG app sudo spctl --master-enable 檢查 .dmg 是否已簽署 codesign -dvv CloudCoin_Wallet-$VERSION.dmg # or spctl -a -v CloudCoin_Wallet-$VERSION.dmg 如何簽署 DMG Distribute outside the Mac App Store (macOS) Sign a Mac Installer Package with a Developer ID certificate Create, export, and delete signing certificates Sample: https://github.com/rokstrnisa/.../package.sh Packing jar as AppImage 要將可以執行的單一 jar 檔封裝成 AppImage 格式。 使用 jpackage,先將 jar 封裝成 --type app-image。 使用 appimagetool,將上述的 image 目錄編譯為 AppImage 格式。 With jpackage) mkdir {icons,input,output,temp} tree -L 3 --dirsfirst --filelimit 10 --sort=name . ├── icons │ └── CloudCoin_Wallet-Dark.png ├── input │ └── CloudCoin.D.3.0.15.jar ├── output │ ├── CloudCoin_Wallet-Dark │ │ ├── bin │ │ └── lib │ └── cloudcoin-wallet-dark_3.0.15-1_amd64.deb ├── temp ├── build.sh └── license.txt 7 directories, 5 files build.sh: export PATH="$PATH:~/opt/jdk-14/bin" [ -d temp ] && rm -rf temp/* jpackage \ --type "app-image" \ --name CloudCoin_Wallet-Dark \ --description "CloudCoin Wallet - Dark Edition. For more information please visit https//cloudcoin.global." \ --vendor "CloudCoin Consortium" \ --app-version 3.0.15 \ --input input --dest output --temp temp \ --icon icons/CloudCoin_Wallet-Dark.png \ --copyright "CloudCoin™ Global Consortium © 2020 The Future of Currency" \ --main-jar CloudCoin.D.3.0.15.jar 開始封裝 封裝完成後會產生一個免安裝執行的程式目錄,儲存位置在 output 目錄下。 bash build.sh With appimagetool) 1. 下載 appimagetool Download: https://appimage.github.io/appimagetool/ 2. 建立專案需要的目錄 mkdir CloudCoin_Wallet-Dark.AppDir mkdir -p CloudCoin_Wallet-Dark.AppDir/usr/share/applications mkdir -p CloudCoin_Wallet-Dark.AppDir/usr/share/icons/hicolor/256x256/apps 3. 複製 jpackage 封裝後程式目錄內的內容至 usr/ 底下 4. 複製 App 圖示檔(.png) 不同的 distributions 預設的 App Icon 路徑不大相同,如果發現有特定版本無法正常顯示 App 圖示,試試加上其他 icon 的路徑。 圖檔路徑: CloudCoin_Wallet-Dark.AppDir/usr/share/icons/hicolor/256x256/CloudCoin_Wallet-Dark.png CloudCoin_Wallet-Dark.AppDir/usr/share/icons/hicolor/256x256/apps/CloudCoin_Wallet-Dark.png 圖檔 size:256 x 256 5. 建立 App 啟動捷徑(.desktop) CloudCoin_Wallet-Dark.desktop: [Desktop Entry] Name=CloudCoin Wallet(Dark-3.0.15) Icon=CloudCoin_Wallet-Dark Exec=CloudCoin_Wallet-Dark %F Type=Application Categories=Finance; Comment=CloudCoin Wallet - Dark Edition Terminal=false StartupNotify=true NoDisplay=false Name[zh_TW]=CloudCoin Wallet(Dark-3.0.15) Icon - 圖示檔的檔名 Exec - 程式執行檔的檔名 捷徑檔路徑 - CloudCoin_Wallet-Dark.AppDir/usr/share/applications/CloudCoin_Wallet-Dark.desktop 6. 新增幾個連結檔 cd CloudCoin_Wallet-Dark.AppDir ln -s usr/bin/CloudCoin_Wallet-Dark AppRun ln -s usr/share/applications/CloudCoin_Wallet-Dark.desktop ./ ln -s usr/share/icons/hicolor/256x256/CloudCoin_Wallet-Dark.png ./ cd ../ 完成後,目錄樹架構如下: usr/bin 與 usr/lib 的內容是 jpackage 產生的。 tree --dirsfirst --filelimit 10 --sort=name . ├── CloudCoin_Wallet-Dark.AppDir │ ├── usr │ │ ├── bin │ │ │ └── CloudCoin_Wallet-Dark │ │ ├── lib │ │ │ ├── app │ │ │ │ ├── CloudCoin.D.3.0.15.jar │ │ │ │ └── CloudCoin_Wallet-Dark.cfg │ │ │ ├── runtime │ │ │ │ ├── conf │ │ │ │ │ ├── management │ │ │ │ │ │ ├── jmxremote.access │ │ │ │ │ │ ├── jmxremote.password.template │ │ │ │ │ │ └── management.properties │ │ │ │ │ ├── sdp │ │ │ │ │ │ └── sdp.conf.template │ │ │ │ │ ├── security │ │ │ │ │ │ ├── policy │ │ │ │ │ │ │ ├── limited │ │ │ │ │ │ │ │ ├── default_local.policy │ │ │ │ │ │ │ │ ├── default_US_export.policy │ │ │ │ │ │ │ │ └── exempt_local.policy │ │ │ │ │ │ │ ├── unlimited │ │ │ │ │ │ │ │ ├── default_local.policy │ │ │ │ │ │ │ │ └── default_US_export.policy │ │ │ │ │ │ │ └── README.txt │ │ │ │ │ │ ├── java.policy │ │ │ │ │ │ └── java.security │ │ │ │ │ ├── logging.properties │ │ │ │ │ ├── net.properties │ │ │ │ │ └── sound.properties │ │ │ │ ├── legal [63 entries exceeds filelimit, not opening dir] │ │ │ │ ├── lib [47 entries exceeds filelimit, not opening dir] │ │ │ │ └── release │ │ │ ├── CloudCoin_Wallet-Dark.png │ │ │ └── libapplauncher.so │ │ └── share │ │ ├── applications │ │ │ └── CloudCoin_Wallet-Dark.desktop │ │ └── icons │ │ └── hicolor │ │ └── 256x256 │ │ ├── apps │ │ │ └── CloudCoin_Wallet-Dark.png │ │ └── CloudCoin_Wallet-Dark.png │ ├── AppRun -> usr/bin/CloudCoin_Wallet-Dark │ ├── CloudCoin_Wallet-Dark.desktop -> usr/share/applications/CloudCoin_Wallet-Dark.desktop │ └── CloudCoin_Wallet-Dark.png -> usr/share/icons/hicolor/256x256/CloudCoin_Wallet-Dark.png ├── appimagetool-x86_64.AppImage ├── CloudCoin_Wallet-Dark.3.0.22-x86_64.AppImage 7. 開始編譯 chmod u+x appimagetool-x86_64.AppImage ./appimagetool-x86_64.AppImage CloudCoin_Wallet-Dark.AppDir CloudCoin_Wallet-Dark-x86_64.AppImage