今回は、Java14で追加されたjpackageを使った際のメモです。
簡単なアプリを作成して、Mac用にビルドしてみたいと思います。
アプリの仕様は簡単に、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);
}
}
実行して、正常に動作することを確認しておきます。
ビルド準備
dmgファイルを作成するために前準備をします。
事前にjarとアプリのアイコン用の画像を用意します。
jar作成
当然ですが、jarの作成の前にビルドを行います。
IDEの機能でも良いですし、コマンドでも良いです。
javac -d out src/*.java
エラーチェック有り
javac -d out -Xlint:deprecation src/*.java
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に追加。
画像用意
アプリのアイコン等で表示する画像を用意します。
画像は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ファイルが生成されます。
アプリ起動確認
dmgファイルを作成できたら、ダブルクリック等で起動します。
アプリがマウントされたら、/Applicationsにインストールします。
インストールされたら、Launchpadなどでも表示されると思います。
正常に動作することを確認します。
今回のメモは異常です。
今回はSwingで簡易的なGUIを実装しましたが、
JavaFXなどでも問題なく動作すると思います。