Java jpackage アプリ 配布 dmg パッケージ 作成

今回は、Java14で追加されたjpackageを使った際のメモです。
簡単なアプリを作成して、Mac用にビルドしてみたいと思います。

jpackage swing java

アプリの仕様は簡単に、CPU・メモリの使用率を表示させるGUIアプリ(Swing)にしてみようと思います。
雑ですみませんが、確認様なのでパフォーマンスなどは考慮しません。

環境・バージョン

  • MacOS:Sonoma 14.6
  • openjdk :19.0.2
  • IntelliJ IDEA:2024.2 (Ultimate Edition)

サンプルプログラム

import javax.swing.*;
import java.awt.*;
import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;
import java.util.Timer;
import java.util.TimerTask;

public class ResourceMonitorApp {

private JFrame frame;
private JLabel cpuLabel;
private JLabel memoryLabel;
private OperatingSystemMXBean osBean;

public ResourceMonitorApp() {
    // OperatingSystemMXBeanを取得してシステム情報を取得する
    osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);

    // GUIコンポーネントの初期化
    frame = new JFrame("Resource Monitor");
    cpuLabel = new JLabel("CPU Usage: ");
    memoryLabel = new JLabel("Memory Usage: ");

    // レイアウト設定
    frame.setLayout(new GridLayout(2, 1));
    frame.add(cpuLabel);
    frame.add(memoryLabel);
    frame.setSize(300, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    // タイマーで定期的にCPU・メモリ使用率を更新
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            updateResourceUsage();
        }
    }, 0, 1000); // 1秒ごとに更新
}

// CPUとメモリ使用率の更新
private void updateResourceUsage() {
    double cpuLoad = osBean.getCpuLoad() * 100; // CPU使用率 (0.0~1.0)
    long totalMemory = osBean.getTotalMemorySize();
    long freeMemory = osBean.getFreeMemorySize();
    long usedMemory = totalMemory - freeMemory;

    // Swingコンポーネントを更新
    SwingUtilities.invokeLater(() -> {
        cpuLabel.setText(String.format("・CPU Usage: %.2f%%", cpuLoad));
        memoryLabel.setText(String.format("・Memory Usage: %d MB / %d MB",
        usedMemory / (1024 * 1024), totalMemory / (1024 * 1024)));
    });
}

  public static void main(String[] args) {
      // GUIアプリケーションの起動
      SwingUtilities.invokeLater(ResourceMonitorApp::new);
  }
}

実行して、正常に動作することを確認しておきます。

jpackage swing java

ビルド準備

dmgファイルを作成するために前準備をします。
事前にjarとアプリのアイコン用の画像を用意します。

jar作成

当然ですが、jarの作成の前にビルドを行います。
IDEの機能でも良いですし、コマンドでも良いです。

javac -d out src/*.java

エラーチェック有り

javac -d out -Xlint:deprecation src/*.java

jpackage swing java comple

 

jar作成は以下などで行えます。

jar –create –file 出力パス/jarファイル名 –main-class メインクラス名 -C メインクラス基準パス アーカイブ対象パス

jar --create --file out/build/ResourceMonitorApp.jar --main-class ResourceMonitorApp -C out/ .

–create: 新しいJARファイルを作成するオプション。
–file out/build/ResourceMonitorApp.jar: 出力するJARファイルのパスと名前を指定。
–main-class ResourceMonitorApp: JARファイルのエントリーポイントとなるメインクラスを指定。
-C out/ .: outディレクトリを基準にして、すべてのファイルをJARに追加。

jpackage swing create jar

画像用意

アプリのアイコン等で表示する画像を用意します。
画像はicns形式で用意します。今回は、縦横128pxでトライしてみます。
サイズや細かなベストプラクティスはAppleが開発者向けに公開している情報などを参考にしてください。
https://developer.apple.com/jp/design/human-interface-guidelines/app-icons#App-icon-sizes

アプリビルド

準備ができたら、jpackageコマンドでdmgファイルを作成します。

jpackage --input . --main-jar out/build/ResourceMonitorApp.jar --main-class ResourceMonitorApp --name "ResourceMonitorApp" --icon img/cpu-memory-checker-128x.icns --type dmg --dest out/build/dmg

–input .: 入力ファイルのディレクトリを指定。ここではカレントディレクトリ。
–main-jar out/build/ResourceMonitorApp.jar: メインとなるJARファイルを指定。
–main-class ResourceMonitorApp: アプリケーションのエントリーポイントとなるメインクラスを指定。
–name “ResourceMonitorApp”: パッケージ化されたアプリケーションの名前を指定。
–icon img/CPU-Memory-Checker-200x.icns: アプリケーションのアイコンファイルを指定。
–type dmg: 出力するパッケージの形式を指定。ここではmacOSのディスクイメージ(DMG)。
–dest out/build/dmg: 出力先ディレクトリを指定。

特にエラーがなければdmgファイルが生成されます。

jpackage swing java create dmg

jpackage swing java create dmg


アプリ起動確認

dmgファイルを作成できたら、ダブルクリック等で起動します。

jpackage swing java dmg

アプリがマウントされたら、/Applicationsにインストールします。

jpackage swing java dmg

インストールされたら、Launchpadなどでも表示されると思います。

jpackage swing java dmg

正常に動作することを確認します。

jpackage swing java dmg


今回のメモは異常です。
今回はSwingで簡易的なGUIを実装しましたが、
JavaFXなどでも問題なく動作すると思います。

都内でエンジニアをやっています。 2017年に脱サラ(法人設立)しました。 仕事で調べたことや、気になったことをメモしています。
投稿を作成しました 172

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る