Skip to content

ネイティブ配布

ここでは、ネイティブ配布について学びます。サポートされているすべてのシステム向けのインストーラーやパッケージの作成方法、および配布用と同じ設定でアプリケーションをローカルで実行する方法について説明します。

以下のトピックの詳細については、このまま読み進めてください。

Gradle プラグイン

このガイドは、主に Compose Multiplatform Gradle プラグインを使用した Compose アプリケーションのパッケージ化に焦点を当てています。 org.jetbrains.compose プラグインは、基本的なパッケージ化、難読化、および macOS のコード署名のためのタスクを提供します。

このプラグインは、jpackage を使用したネイティブ配布用のパッケージ化プロセスと、ローカルでのアプリケーション実行を簡素化します。 配布可能なアプリケーションは、必要なすべての Java ランタイムコンポーネントを含む自己完結型のインストール可能なバイナリであり、ターゲットシステムに JDK がインストールされている必要はありません。

パッケージサイズを最小限に抑えるために、Gradle プラグインは jlink ツールを使用して、配布パッケージに必要な Java モジュールのみが含まれるようにします。 ただし、どのモジュールが必要かを指定するために Gradle プラグインを設定する必要があります。 詳細については、JDK モジュールの含め方のセクションを参照してください。

代替案として、JetBrains が開発していない外部ツールである Conveyor を使用することもできます。 Conveyor はオンラインアップデート、クロスビルド、およびその他のさまざまな機能をサポートしていますが、オープンソースでないプロジェクトにはライセンスが必要です。 詳細については、Conveyor のドキュメントを参照してください。

基本的なタスク

Compose Multiplatform Gradle プラグインにおける基本的な設定単位は application です(非推奨となった Gradle application プラグインと混同しないでください)。

application DSL メソッドは、最終的なバイナリセットの共有設定を定義します。これにより、ファイルのコレクションを JDK ディストリビューションとともに、さまざまな形式の圧縮されたバイナリインストーラーにパックできます。

サポートされているオペレーティングシステムでは、以下の形式が利用可能です。

  • macOS: .dmg (TargetFormat.Dmg)、.pkg (TargetFormat.Pkg)
  • Windows: .exe (TargetFormat.Exe)、.msi (TargetFormat.Msi)
  • Linux: .deb (TargetFormat.Deb)、.rpm (TargetFormat.Rpm)

以下は、基本的なデスクトップ設定を含む build.gradle.kts ファイルの例です。

kotlin
import org.jetbrains.compose.desktop.application.dsl.TargetFormat

plugins {
    kotlin("jvm")
    id("org.jetbrains.compose")
}

dependencies {
    implementation(compose.desktop.currentOs)
}

compose.desktop {
    application {
        mainClass = "example.MainKt"

        nativeDistributions {
            targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Exe)
        }
    }
}

プロジェクトをビルドすると、プラグインは以下のタスクを作成します。

Gradle タスク説明
package<FormatName>アプリケーションを対応する FormatName バイナリにパッケージ化します。現在、クロスコンパイルはサポートされていません。 つまり、特定の形式をビルドするには、対応する互換性のある OS を使用する必要があります。 たとえば、.dmg バイナリをビルドするには、macOS で packageDmg タスクを実行する必要があります。 現在の OS と互換性のないタスクは、デフォルトでスキップされます。
packageDistributionForCurrentOSアプリケーションのすべてのパッケージタスクを集約します。これは ライフサイクルタスク です。
packageUberJarForCurrentOS現在のオペレーティングシステムのすべての依存関係を含む単一の jar ファイルを作成します。 このタスクは、compose.desktop.currentOScompileimplementation、または runtime 依存関係として使用されていることを想定しています。
runmainClass で指定されたエントリポイントからアプリケーションをローカルで実行します。run タスクは、フルランタイムを備えたパッケージ化されていない JVM アプリケーションを起動します。 この方法は、ランタイムを最小化したコンパクトなバイナリイメージを作成するよりも高速でデバッグが容易です。 最終的なバイナリイメージを実行するには、代わりに runDistributable タスクを使用してください。
createDistributableインストーラーを作成せずに、最終的なアプリケーションイメージを作成します。
runDistributable事前パッケージ化されたアプリケーションイメージを実行します。

利用可能なすべてのタスクは、Gradle ツールウィンドウにリストされます。タスクを実行すると、Gradle は ${project.buildDir}/compose/binaries ディレクトリに出力バイナリを生成します。

JDK モジュールの含め方

配布サイズを削減するために、Gradle プラグインは jlink を使用して、必要な JDK モジュールのみをバンドルします。

現時点では、Gradle プラグインは必要な JDK モジュールを自動的に判断しません。これはコンパイルエラーの原因にはなりませんが、 必要なモジュールが提供されない場合、実行時に ClassNotFoundException が発生する可能性があります。

パッケージ化されたアプリケーションまたは runDistributable タスクの実行時に ClassNotFoundException が発生した場合は、modules DSL メソッドを使用して追加の JDK モジュールを含めることができます。

kotlin
compose.desktop {
    application {
        nativeDistributions {
            modules("java.sql")
            // または: includeAllModules = true
        }
    }
}

必要なモジュールを手動で指定するか、suggestModules を実行することができます。suggestModules タスクは jdeps 静的解析ツールを使用して、不足している可能性のあるモジュールを特定します。 ツールの出力は不完全であったり、不要なモジュールがリストされたりする場合があることに注意してください。

配布物のサイズが重要な要素ではなく、無視できる場合は、includeAllModules DSL プロパティを使用してすべてのランタイムモジュールを含めることを選択できます。

配布プロパティの指定方法

パッケージバージョン

ネイティブ配布パッケージには、特定のパッケージバージョンが必要です。 パッケージバージョンを指定するには、以下の DSL プロパティを使用できます。これらは優先度の高い順に並んでいます。

  • nativeDistributions.<os>.<packageFormat>PackageVersion は、単一のパッケージ形式のバージョンを指定します。
  • nativeDistributions.<os>.packageVersion は、単一のターゲット OS のバージョンを指定します。
  • nativeDistributions.packageVersion は、すべてのパッケージのバージョンを指定します。

macOS では、以下の DSL プロパティを使用してビルドバージョンを指定することもできます。これも優先度の高い順に並んでいます。

  • nativeDistributions.macOS.<packageFormat>PackageBuildVersion は、単一のパッケージ形式のビルドバージョンを指定します。
  • nativeDistributions.macOS.packageBuildVersion は、すべての macOS パッケージのビルドバージョンを指定します。

ビルドバージョンを指定しない場合、Gradle は代わりにパッケージバージョンを使用します。macOS でのバージョニングの詳細については、 CFBundleShortVersionString および CFBundleVersion のドキュメントを参照してください。

以下は、優先順位に従ってパッケージバージョンを指定するためのテンプレートです。

kotlin
compose.desktop {
    application {
        nativeDistributions {
            // すべてのパッケージのバージョン
            packageVersion = "..." 
          
            macOS {
              // すべての macOS パッケージのバージョン
              packageVersion = "..."
              // dmg パッケージのみのバージョン
              dmgPackageVersion = "..." 
              // pkg パッケージのみのバージョン
              pkgPackageVersion = "..." 
              
              // すべての macOS パッケージのビルドバージョン
              packageBuildVersion = "..."
              // dmg パッケージのみのビルドバージョン
              dmgPackageBuildVersion = "..." 
              // pkg パッケージのみのビルドバージョン
              pkgPackageBuildVersion = "..." 
            }
            windows {
              // すべての Windows パッケージのバージョン
              packageVersion = "..."  
              // msi パッケージのみのバージョン
              msiPackageVersion = "..."
              // exe パッケージのみのバージョン
              exePackageVersion = "..." 
            }
            linux {
              // すべての Linux パッケージのバージョン
              packageVersion = "..."
              // deb パッケージのみのバージョン
              debPackageVersion = "..."
              // rpm パッケージのみのバージョン
              rpmPackageVersion = "..."
            }
        }
    }
}

パッケージバージョンを定義するには、以下のルールに従ってください。

ファイル形式バージョン形式詳細
dmg, pkgMAJOR[.MINOR][.PATCH]
  • MAJOR は非負の整数
  • MINOR はオプションの非負の整数
  • PATCH はオプションの非負の整数
msi, exeMAJOR.MINOR.BUILD
  • MAJOR は 255 以下の非負の整数
  • MINOR は 255 以下の非負의 整数
  • BUILD は 65535 以下の非負の整数
deb[EPOCH:]UPSTREAM_VERSION[-DEBIAN_REVISION]
  • EPOCH はオプションの非負の整数
  • UPSTREAM_VERSION:
    • 英数字と ., +, -, ~ 文字のみを含めることができます
    • 数字で始まる必要があります
  • DEBIAN_REVISION:
    • オプション
    • 英数字と ., +, ~ 文字のみを含めることができます
詳細については、Debian のドキュメント を参照してください。
rpm任意の形式バージョンに - (ハイフン) 文字を含めることはできません。

JDK バージョン

このプラグインは jpackage を使用します。これには JDK 17 以上の JDK バージョンが必要です。 JDK バージョンを指定するときは、以下の要件の少なくとも 1 つを満たしていることを確認してください。

  • JAVA_HOME 環境変数が、互換性のある JDK バージョンを指している。

  • DSL を介して javaHome プロパティが設定されている:

    kotlin
    compose.desktop {
        application {
            javaHome = System.getenv("JDK_17")
        }
    }

出力ディレクトリ

ネイティブ配布用にカスタム出力ディレクトリを使用するには、以下に示すように outputBaseDir プロパティを設定します。

kotlin
compose.desktop {
    application {
        nativeDistributions {
            outputBaseDir.set(project.layout.buildDirectory.dir("customOutputDir"))
        }
    }
}

ランチャープロパティ

アプリケーションの起動プロセスを調整するために、以下のプロパティをカスタマイズできます。

プロパティ説明
mainClassmain メソッドを含むクラスの完全修飾名。
argsアプリケーションの main メソッドへの引数。
jvmArgsアプリケーションの JVM への引数。

設定例を以下に示します。

kotlin
compose.desktop {
    application {
        mainClass = "MainKt"
        args += listOf("-customArgument")
        jvmArgs += listOf("-Xmx2G")
    }
}

メタデータ

nativeDistributions DSL ブロック内で、以下のプロパティを設定できます。

プロパティ説明デフォルト値
packageNameアプリケーション名。Gradle プロジェクトの 名前 (name)
packageVersionアプリケーションのバージョン。Gradle プロジェクトの バージョン (version)
descriptionアプリケーションの説明。なし
copyrightアプリケーションの著作権情報。なし
vendorアプリケーションのベンダー。なし
licenseFileアプリケーションのライセンスファイル。なし

設定例を以下に示します。

kotlin
compose.desktop {
    application {
        nativeDistributions {
            packageName = "ExampleApp"
            packageVersion = "0.1-SNAPSHOT"
            description = "Compose Multiplatform App"
            copyright = "© 2024 My Name. All rights reserved."
            vendor = "Example vendor"
            licenseFile.set(project.file("LICENSE.txt"))
        }
    }
}

リソースの管理

リソースをパッケージ化してロードするには、Compose Multiplatform リソースライブラリ、JVM リソースロードを使用するか、パッケージ化されたアプリケーションにファイルを追加します。

リソースライブラリ

プロジェクトのリソースをセットアップする最も簡単な方法は、リソースライブラリを使用することです。 リソースライブラリを使用すると、サポートされているすべてのプラットフォームにわたる共通コードからリソースにアクセスできます。 詳細については、マルチプラットフォームリソース を参照してください。

JVM リソースロード

デスクトップ用の Compose Multiplatform は JVM プラットフォーム上で動作するため、java.lang.Class API を使用して .jar ファイルからリソースをロードできます。src/main/resources ディレクトリ内のファイルには、Class::getResource または Class::getResourceAsStream を介してアクセスできます。

パッケージ化されたアプリケーションへのファイルの追加

.jar ファイルからリソースをロードするのがあまり実用的でない場合があります。たとえば、ターゲット固有のアセットがあり、macOS パッケージには含めるが Windows パッケージには含めたくないファイルがある場合などです。

このような場合、インストールディレクトリに追加のリソースファイルを含めるように Gradle プラグインを設定できます。 以下のように DSL を使用して、ルートリソースディレクトリを指定します。

kotlin
compose.desktop {
    application {
        mainClass = "MainKt"
        nativeDistributions {
            targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
            packageVersion = "1.0.0"

            appResourcesRootDir.set(project.layout.projectDirectory.dir("resources"))
        }
    }
}

上記の例では、ルートリソースディレクトリは <PROJECT_DIR>/resources として定義されています。

Gradle プラグインは、以下のようにリソースサブディレクトリからファイルを取り込みます。

  1. 共通リソース:<RESOURCES_ROOT_DIR>/common にあるファイルは、ターゲットの OS やアーキテクチャに関係なく、すべてのパッケージに含まれます。

  2. OS 固有のリソース:<RESOURCES_ROOT_DIR>/<OS_NAME> にあるファイルは、特定のオペレーティングシステム用にビルドされたパッケージにのみ含まれます。 <OS_NAME> の有効な値は、windowsmacoslinux です。

  3. OS およびアーキテクチャ固有のリソース:<RESOURCES_ROOT_DIR>/<OS_NAME>-<ARCH_NAME> にあるファイルは、特定のオペレーティングシステムと CPU アーキテクチャの組み合わせに対してビルドされたパッケージにのみ含まれます。 <ARCH_NAME> の有効な値は、x64 および arm64 です。 たとえば、<RESOURCES_ROOT_DIR>/macos-arm64 内のファイルは、Apple シリコン搭載の Mac 用のパッケージにのみ含まれます。

compose.application.resources.dir システムプロパティを使用して、含まれているリソースにアクセスできます。

kotlin
import java.io.File

val resourcesDir = File(System.getProperty("compose.application.resources.dir"))

fun main() {
    println(resourcesDir.resolve("resource.txt").readText())
}

カスタムソースセット

org.jetbrains.kotlin.jvm または org.jetbrains.kotlin.multiplatform プラグインを使用している場合は、デフォルト設定を利用できます。

  • org.jetbrains.kotlin.jvm を使用した設定には、main ソースセット の内容が含まれます。
  • org.jetbrains.kotlin.multiplatform を使用した設定には、単一の JVM ターゲット の内容が含まれます。 複数の JVM ターゲットを定義すると、デフォルト設定は無効になります。この場合、プラグインを手動で設定するか、単一のターゲットを指定する必要があります(下記参照)。

デフォルト設定が曖昧または不十分な場合は、いくつかの方法でカスタマイズできます。

Gradle ソースセット を使用する場合:

plugins {
    kotlin("jvm")
    id("org.jetbrains.compose")
}
val customSourceSet = sourceSets.create("customSourceSet")
compose.desktop {
    application {
        from(customSourceSet)
    }
}

Kotlin JVM ターゲット を使用する場合:

plugins {
    kotlin("multiplatform")
    id("org.jetbrains.compose")
} 
kotlin {
    jvm("customJvmTarget") {}
}
compose.desktop {
    application {
        from(kotlin.targets["customJvmTarget"])
    }
}

手動で設定する場合:

  • デフォルト設定を無効にするには disableDefaultConfiguration を使用します。
  • 含めるファイルを指定するには fromFiles を使用します。
  • メインクラスを含む .jar ファイルを指すように mainJar ファイルプロパティを指定します。
  • すべてのプラグインタスクにタスク依存関係を追加するには dependsOn を使用します。
compose.desktop {
    application {
        disableDefaultConfiguration()
        fromFiles(project.fileTree("libs/") { include("**/*.jar") })
        mainJar.set(project.file("main.jar"))
        dependsOn("mainJarTask")
    }
}

アプリケーションアイコン

アプリのアイコンが、以下の OS 固有の形式で利用可能であることを確認してください。

  • macOS 用: .icns
  • Windows 用: .ico
  • Linux 用: .png
kotlin
compose.desktop {
    application {
        nativeDistributions {
            macOS {
                iconFile.set(project.file("icon.icns"))
            }
            windows {
                iconFile.set(project.file("icon.ico"))
            }
            linux {
                iconFile.set(project.file("icon.png"))
            }
        }
    }
}

プラットフォーム固有のオプション

プラットフォーム固有の設定は、対応する DSL ブロックを使用して構成できます。

compose.desktop {
    application {
        nativeDistributions {
            macOS {
                // macOS 用のオプション
            }
            windows {
                // Windows 用のオプション
            }
            linux {
                // Linux 用のオプション
            }
        }
    }
}

以下の表は、サポートされているすべてのプラットフォーム固有のオプションを示しています。ドキュメント化されていないプロパティの使用は 推奨されません

プラットフォームオプション説明
全プラットフォームiconFile.set(File("PATH_TO_ICON"))アプリケーションのプラットフォーム固有のアイコンへのパスを指定します。詳細は アプリケーションアイコン セクションを参照してください。
packageVersion = "1.0.0"プラットフォーム固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。
installationPath = "PATH_TO_INST_DIR"デフォルトのインストールディレクトリへの絶対パスまたは相対パスを指定します。 Windows では、インストール中にパスをカスタマイズできるように dirChooser = true を使用することもできます。
LinuxpackageName = "custom-package-name"デフォルトのアプリケーション名をオーバーライドします。
debMaintainer = "[email protected]"パッケージメンテナーのメールアドレスを指定します。
menuGroup = "my-example-menu-group"アプリケーションのメニューグループを定義します。
appRelease = "1"rpm パッケージのリリース値、または deb パッケージのリビジョン値を設定します。
appCategory = "CATEGORY"rpm パッケージのグループ値、または deb パッケージのセクション値を割り当てます。
rpmLicenseType = "TYPE_OF_LICENSE"rpm パッケージのライセンスの種類を指定します。
debPackageVersion = "DEB_VERSION"deb 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。
rpmPackageVersion = "RPM_VERSION"rpm 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。
macOSbundleID 一意のアプリケーション識別子を指定します。これには英数字(A-Za-z0-9)、ハイフン(-)、 ピリオド(.)のみを含めることができます。リバース DNS 表記(com.mycompany.myapp)の使用が推奨されます。
packageNameアプリケーションの名前。
dockName メニューバー、「<アプリ>について」メニュー項目、および Dock に表示されるアプリケーションの名前。 デフォルト値は packageName です。
minimumSystemVersion アプリケーションの実行に必要な最小 macOS バージョン。詳細は LSMinimumSystemVersion を参照してください。
signing, notarization, provisioningProfile, runtimeProvisioningProfile macOS 用の配布物の署名と公証 チュートリアルを参照してください。
appStore = trueApple App Store 用にアプリをビルドして署名するかどうかを指定します。JDK 17 以上が必要です。
appCategory Apple App Store 用のアプリのカテゴリ。App Store 用にビルドする場合、デフォルト値は public.app-category.utilities で、それ以外の場合は Unknown です。 有効なカテゴリのリストについては LSApplicationCategoryType を参照してください。
entitlementsFile.set(File("PATH_ENT")) 署名時に使用されるエンタイトルメントを含むファイルへのパスを指定します。カスタムファイルを提供するときは、 Java アプリケーションに必要なエンタイトルメントを追加してください。App Store 用にビルドするときに使用されるデフォルトのファイルについては、 sandbox.plist を参照してください。このデフォルトファイルは JDK バージョンによって異なる場合があることに注意してください。 ファイルが指定されていない場合、プラグインは jpackage によって提供されるデフォルトのエンタイトルメントを使用します。 詳細は macOS 用の配布物の署名と公証 チュートリアルを参照してください。
runtimeEntitlementsFile.set(File("PATH_R_ENT")) JVM ランタイムの署名時に使用されるエンタイトルメントを含むファイルへのパスを指定します。カスタムファイルを提供するときは、 Java アプリケーションに必要なエンタイトルメントを追加してください。デフォルトのファイルについては sandbox.plist を参照してください。詳細は macOS 用の配布物の署名と公証 チュートリアルを参照してください。
dmgPackageVersion = "DMG_VERSION" DMG 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。
pkgPackageVersion = "PKG_VERSION" PKG 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。
packageBuildVersion = "DMG_VERSION" パッケージのビルドバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。
dmgPackageBuildVersion = "DMG_VERSION" DMG 固有のパッケージビルドバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。
pkgPackageBuildVersion = "PKG_VERSION" PKG 固有のパッケージビルドバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。
infoPlistmacOS での Info.plist セクションを参照してください。
Windowsconsole = trueアプリケーションにコンソールランチャーを追加します。
dirChooser = trueインストール中にインストールパスをカスタマイズできるようにします。
perUserInstall = trueアプリケーションをユーザーごとにインストールできるようにします。
menuGroup = "start-menu-group"指定したスタートメニューグループにアプリケーションを追加します。
upgradeUuid = "UUID"インストールされているバージョンよりも新しいバージョンがある場合に、ユーザーがインストーラーを介して アプリケーションを更新できるようにする一意の ID を指定します。値は単一のアプリケーションに対して一定である必要があります。 詳細については How To: Generate a GUID を参照してください。
msiPackageVersion = "MSI_VERSION"MSI 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。
exePackageVersion = "EXE_VERSION"EXE 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。

macOS 固有の設定

macOS での署名と公証

最新の macOS バージョンでは、インターネットからダウンロードした署名されていないアプリケーションの実行を許可していません。そのようなアプリケーションを実行しようとすると、次のエラーが発生します:「"YourApp"は壊れているため開けません。ディスクイメージを取り出す必要があります。」

アプリケーションに署名して公証する方法については、こちらの チュートリアル を参照してください。

macOS での Information property list

DSL は重要なプラットフォーム固有のカスタマイズをサポートしていますが、提供されている機能だけでは不十分な場合があります。 DSL で表現されていない Info.plist の値を指定する必要がある場合は、回避策として生の XML スニペットを含めることができます。この XML はアプリケーションの Info.plist に追加されます。

例:ディープリンク

  1. build.gradle.kts ファイルでカスタム URL スキームを定義します。
compose.desktop {
    application {
        mainClass = "MainKt"
        nativeDistributions {
            targetFormats(TargetFormat.Dmg)
            packageName = "Deep Linking Example App"
            macOS {
                bundleID = "org.jetbrains.compose.examples.deeplinking"
                infoPlist {
                    extraKeysRawXml = macExtraPlistKeys
                }
            }
        }
    }
}

val macExtraPlistKeys: String
    get() = """
      <key>CFBundleURLTypes</key>
      <array>
        <dict>
          <key>CFBundleURLName</key>
          <string>Example deep link</string>
          <key>CFBundleURLSchemes</key>
          <array>
            <string>compose</string>
          </array>
        </dict>
      </array>
    """
  1. java.awt.Desktop クラスを使用して、src/main/main.kt ファイルに URI ハンドラーをセットアップします。
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.window.singleWindowApplication
import java.awt.Desktop

fun main() {
    var text by mutableStateOf("Hello, World!")

    try {
        Desktop.getDesktop().setOpenURIHandler { event ->
            text = "Open URI: " + event.uri
        }
    } catch (e: UnsupportedOperationException) {
        println("setOpenURIHandler is unsupported")
    }

    singleWindowApplication {
        MaterialTheme {
            Text(text)
        }
    }
}
  1. runDistributable タスクを実行します:./gradlew runDistributable

その結果、compose://foo/bar のようなリンクをブラウザからアプリケーションにリダイレクトできるようになります。

ミニファイと難読化

Compose Multiplatform Gradle プラグインには、ProGuard のサポートが組み込まれています。 ProGuard は、コードのミニファイ(縮小化)と難読化のための オープンソースツール です。

デフォルト パッケージングタスク(ProGuard なし)に対して、Gradle プラグインは リリース タスク(ProGuard あり)を提供します。

Gradle タスク説明

デフォルト: createDistributable

リリース: createReleaseDistributable

JDK とリソースがバンドルされたアプリケーションイメージを作成します。

デフォルト: runDistributable

リリース: runReleaseDistributable

JDK とリソースがバンドルされたアプリケーションイメージを実行します。

デフォルト: run

リリース: runRelease

Gradle JDK を使用して、パッケージ化されていないアプリケーション .jar を実行します。

デフォルト: package<FORMAT_NAME>

リリース: packageRelease<FORMAT_NAME>

アプリケーションイメージを <FORMAT_NAME> ファイルにパッケージ化します。

デフォルト: packageDistributionForCurrentOS

リリース: packageReleaseDistributionForCurrentOS

現在の OS と互換性のある形式でアプリケーションイメージをパッケージ化します。

デフォルト: packageUberJarForCurrentOS

リリース: packageReleaseUberJarForCurrentOS

アプリケーションイメージを uber (fat) .jar にパッケージ化します。

デフォルト: notarize<FORMAT_NAME>

リリース: notarizeRelease<FORMAT_NAME>

公証のために <FORMAT_NAME> アプリケーションイメージをアップロードします(macOS のみ)。

デフォルト: checkNotarizationStatus

リリース: checkReleaseNotarizationStatus

公証が成功したかどうかを確認します(macOS のみ)。

デフォルト設定では、いくつかの定義済みの ProGuard ルールが有効になっています。

  • アプリケーションイメージがミニファイされ、使用されていないクラスが削除されます。
  • compose.desktop.application.mainClass がエントリポイントとして使用されます。
  • Compose ランタイムが機能し続けることを保証するために、いくつかの keep ルールが含まれています。

ほとんどの場合、ミニファイされたアプリケーションを得るために追加の設定は必要ありません。 ただし、ProGuard はバイトコード内の一部の使用箇所を追跡できない場合があります(例:リフレクションを介してクラスが使用される場合)。 ProGuard 処理後にのみ発生する問題に遭遇した場合は、カスタムルールを追加する必要があるかもしれません。

カスタム設定ファイルを指定するには、以下のように DSL を使用します。

kotlin
compose.desktop {
    application {
        buildTypes.release.proguard {
            configurationFiles.from(project.file("compose-desktop.pro"))
        }
    }
}

ProGuard ルールと構成オプションの詳細については、Guardsquare の マニュアル を参照してください。

難読化はデフォルトで無効になっています。有効にするには、Gradle DSL を介して以下のプロパティを設定します。

kotlin
compose.desktop {
    application {
        buildTypes.release.proguard {
            obfuscate.set(true)
        }
    }
}

ProGuard の最適化はデフォルトで有効になっています。無効にするには、Gradle DSL を介して以下のプロパティを設定します。

kotlin
compose.desktop {
    application {
        buildTypes.release.proguard {
            optimize.set(false)
        }
    }
}

uber JAR の生成はデフォルトで無効になっており、ProGuard は入力された各 .jar に対して対応する .jar ファイルを生成します。これを有効にするには、Gradle DSL を介して以下のプロパティを設定します。

kotlin
compose.desktop {
    application {
        buildTypes.release.proguard {
            joinOutputJars.set(true)
        }
    }
}

次のステップ

デスクトップコンポーネント に関するチュートリアルをご覧ください。