Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Javaアプリケーションの配布とパッケージング / Distribution and pack...

Avatar for hogelog hogelog
June 06, 2025

Javaアプリケーションの配布とパッケージング / Distribution and packaging of Java applications

JJUG CCC 2025 Spring

よし便利なアプリケーションを作れたぞ! あとはこれを配布してみんなに使ってもらうだけ ……と思ったら、Javaアプリケーションってどう配布すればいいんだっけ?

本セッションではJavaでつくられたGUIツールやコマンドラインツールをどうパッケージングし、どう配布すればいいかをお話します。
jpackageを使った GUIツールの配布、GraalVMを活用したCLIツールのネイティブ化、Windows/macOSでの配布時のセキュリティの課題など、Java製アプリケーションを配布する際に実際に使える手法を紹介します。

Avatar for hogelog

hogelog

June 06, 2025
Tweet

More Decks by hogelog

Other Decks in Technology

Transcript

  1. 自己紹介 @hogelog, 小室 直 (Komuro Sunao) STORES 株式会社 VP of

    Engineering 組織や技術を考えたり決めたり開発に手を出したり。 一番続けている趣味は結局プログラミング。
  2. 実践例: jlsコマンド ※ 例外処理は省略 native-image/src/main/java/com/example/LsCommand.java package com.example; import java.io.File; public

    class LsCommand { public static void main(String[] args) { String path = args.length > 0 ? args[0] : "."; File directory = new File(path); File[] files = directory.listFiles(); for (File file : files) { System.out.println(file.getName()); } } }
  3. Gradleでの設定 ./gradlew nativeCompile でビルド native-image/build.gradle plugins { id 'java' id

    'org.graalvm.buildtools.native' version '0.10.6' } graalvmNative { binaries { main { imageName = 'jls' mainClass = 'com.example.LsCommand' buildArgs.addAll('--no-fallback') javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(24) vendor = JvmVendorSpec.matching("Oracle") } } } }
  4. パフォーマンス比較 Native Image JVM 実行時間 9ms ⚡️ 290ms バイナリサイズ 6.3MB

    📦 - JVM依存 なし ✅ あり 比較コマンド hyperfine -- './build/native/nativeCompile/jls'` hyperfine -- 'java -cp build/libs/native-image-1.0-SNAPSHOT.jar com.example.LsCommand'
  5. 実践例: SimpleNotepad jpackage/src/main/java/com/example/SimpleNotepad.java public class SimpleNotepad extends JFrame { private

    JTextArea textArea; public SimpleNotepad() { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); setTitle("Text Viewer"); setSize(600, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); textArea = new JTextArea(); textArea.setEditable(false); add(new JScrollPane(textArea)); ... } ... }
  6. Java Platform Module System (JPMS) jpackage/src/main/java/module-info.java module com.example.simplenotepad { requires

    java.desktop; // Swing/AWT 用 exports com.example; // メインクラスをエクスポート }
  7. Gradleでの設定 ./gradlew jpackage でビルド jpackage/build.gradle plugins { id 'java' id

    'application' id 'org.beryx.jlink' version '3.1.1' } application { mainClass = 'com.example.SimpleNotepad' mainModule = 'com.example.simplenotepad' } jlink { jpackage { imageName = 'SimpleNotepad' installerName = 'SimpleNotepad' appVersion = '1.0.0' vendor = 'Example Inc.' } }
  8. 生成されるインストーラー ファイル形式 特徴 Windows 🪟 SimpleNotepad.msi ショートカット自動作成 macOS 🍎 SimpleNotepad.dmg

    ドラッグ&ドロップ Linux 🐧 simplenotepad.deb dpkgでインストール 外部依存: なし (JRE同梱でJavaインストール不要 ✅)
  9. 自動化のメリット クロスプラットフォームビルド 効率性 ⚡: タグ一つで全プラットフォーム 可植性 📦: ローカル環境に依存しない 今回例示するリリースフロー #

    1. タグ作成・プッシュ git tag v1.0.0 && git push origin v1.0.0 # 2. 自動ビルド開始 # GitHub Actions が起動 # 3. 成果物配布 # GitHub Releases に自動アップロード
  10. Native Image用GitHub Actions .github/workflows/release-native-image.yml on: push: branches: ['main'] jobs: build:

    runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: graalvm/setup-graalvm@01ed653ac833fe80569f1ef9f25585ba2811baab # v1.3.3 with: java-version: '24' distribution: 'graalvm' - uses: gradle/actions/setup-gradle@8379f6a1328ee0e06e2bb424dadb7b159856a326 # v4.4.0 - run: ./gradlew nativeCompile working-directory: native-image
  11. jpackage用GitHub Actions .github/workflows/release-jpackage.yml on: push: branches: ['main'] jobs: build: runs-on:

    ${{ matrix.os }} strategy: matrix: os: [macos-latest, windows-latest] steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: 'oracle' java-version: '24' - uses: gradle/actions/setup-gradle@8379f6a1328ee0e06e2bb424dadb7b159856a326 # v4.4.0 - run: ./gradlew jpackage working-directory: jpackage