Skip to content

ネイティブディストリビューション

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

以下のトピックの詳細については、引き続きお読みください。

Gradleプラグイン

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

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

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

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

基本的なタスク

Compose Multiplatform Gradleプラグインの基本的な設定可能な単位はapplicationです(これはGradleアプリケーションプラグインと混同しないようにしてください。こちらは非推奨です)。

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")
            // Alternatively: 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 {
            // Version for all packages
            packageVersion = "..." 
          
            macOS {
              // Version for all macOS packages
              packageVersion = "..."
              // Version for the dmg package only
              dmgPackageVersion = "..." 
              // Version for the pkg package only
              pkgPackageVersion = "..." 
              
              // Build version for all macOS packages
              packageBuildVersion = "..."
              // Build version for the dmg package only
              dmgPackageBuildVersion = "..." 
              // Build version for the pkg package only
              pkgPackageBuildVersion = "..." 
            }
            windows {
              // Version for all Windows packages
              packageVersion = "..."  
              // Version for the msi package only
              msiPackageVersion = "..."
              // Version for the exe package only
              exePackageVersion = "..." 
            }
            linux {
              // Version for all Linux packages
              packageVersion = "..."
              // Version for the deb package only
              debPackageVersion = "..."
              // Version for the rpm package only
              rpmPackageVersion = "..."
            }
        }
    }
}

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

ファイルタイプバージョン形式詳細
dmg, pkgMAJOR[.MINOR][.PATCH]
  • MAJORは0より大きい整数
  • 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バージョンを指定する際は、以下のいずれかの要件を満たしていることを確認してください。

  • JAVA_HOME環境変数が互換性のあるJDKバージョンを指している。
  • javaHomeプロパティがDSL経由で設定されている。
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プロジェクトの名前
packageVersionアプリケーションのバージョン。Gradleプロジェクトのバージョン
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 for desktopは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 Silicon 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 ソースセットを使用する:

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

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

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

手動で:

  • disableDefaultConfigurationを使用してデフォルト設定を無効にします。
  • fromFilesを使用して含めるファイルを指定します。
  • mainJarファイルプロパティに、メインクラスを含む.jarファイルを指定します。
  • dependsOnを使用して、すべてのプラグインタスクにタスク依存関係を追加します。
kotlin
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ブロックを使用して構成できます。

kotlin
compose.desktop {
    application {
        nativeDistributions {
            macOS {
                // Options for macOS
            }
            windows {
                // Options for Windows
            }
            linux {
                // Options for 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 メニューバー、「<App>について」メニュー項目、 および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アプリケーションに必要なエンタイトルメントを追加してください。App Store向けにビルドする際に使用されるデフォルトファイルについては、 sandbox.plistを参照してください。このデフォルトファイルはJDKのバージョンによって異なる場合があります。 ファイルが指定されていない場合、プラグインはjpackageが提供するデフォルトのエンタイトルメントを使用します。 詳細については、 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: GUIDを生成するを参照してください。
msiPackageVersion = "MSI_VERSION"MSI固有のパッケージバージョンを設定します。詳細については、パッケージバージョンセクションを参照してください。
exePackageVersion = "EXE_VERSION"EXE固有のパッケージバージョンを設定します。詳細については、パッケージバージョンセクションを参照してください。

macOS固有の構成

macOSでの署名と公証

最新のmacOSバージョンでは、インターネットからダウンロードされた署名されていないアプリケーションの実行が許可されていません。そのようなアプリケーションを実行しようとすると、次のエラーが発生します。「YourApp is damaged and can't be open. You should eject the disk image」(YourAppは破損しており開けません。ディスクイメージを取り出す必要があります)。

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

macOS上のInformation Property List

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

例: ディープリンク

  1. build.gradle.ktsファイルでカスタムURLスキームを定義します。
kotlin
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. src/main/main.ktファイルでjava.awt.Desktopクラスを使用してURIハンドラーを設定します。
kotlin
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)
        }
    }
}

次のステップ

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