Skip to content

Dokka Gradle plugin v2 への移行

DANGER

Dokka Gradleプラグイン v2 は実験的 (Experimental) 機能です。

これはいつでも変更される可能性があります。GitHub でのフィードバックをお待ちしております。

Dokka Gradleプラグイン (DGP) は、GradleでビルドされたKotlinプロジェクトの包括的なAPIドキュメントを生成するためのツールです。

DGPはKotlinのKDocコメントとJavaのJavadocコメントの両方をシームレスに処理し、情報を抽出してHTMLまたはJavadoc形式の構造化されたドキュメントを作成します。

Dokka 2.0.0以降、DGPの新しいバージョンであるDokka Gradleプラグイン v2を試すことができます。Dokka 2.0.0では、Dokka Gradleプラグインをv1またはv2モードのいずれかで利用できます。

DGP v2はDGPに大幅な改善をもたらし、Gradleのベストプラクティスにさらに密接に適合しています。

  • Gradleの型を採用しており、パフォーマンスの向上につながります。
  • 低レベルのタスクベースのセットアップの代わりに直感的なトップレベルDSL設定を使用することで、ビルドスクリプトとその可読性が簡素化されます。
  • ドキュメントの集約に対してより宣言的なアプローチを採用しており、マルチプロジェクトのドキュメント管理が容易になります。
  • 型安全なプラグイン設定を使用しており、ビルドスクリプトの信頼性と保守性が向上します。
  • Gradleのコンフィグレーションキャッシュビルドキャッシュを完全にサポートしており、パフォーマンスを向上させ、ビルド作業を簡素化します。

開始する前に

移行を開始する前に、以下の手順を完了してください。

サポートされているバージョンを確認する

プロジェクトが以下の最小バージョン要件を満たしていることを確認してください。

ツールバージョン
Gradle7.6 or higher
Android Gradle plugin7.0 or higher
Kotlin Gradle plugin1.9 or higher

DGP v2を有効にする

プロジェクトのbuild.gradle.ktsファイルのplugins {}ブロックで、Dokkaのバージョンを2.0.0に更新します。

kotlin
plugins {
    kotlin("jvm") version "2.1.10"
    id("org.jetbrains.dokka") version "2.0.0"
}

または、バージョンカタログを使用してDokka Gradle plugin v2を有効にすることもできます。

TIP

デフォルトでは、DGP v2はHTML形式でドキュメントを生成します。JavadocまたはHTMLとJavadocの両方の形式を生成するには、適切なプラグインを追加します。プラグインの詳細については、ドキュメント出力形式の選択を参照してください。

移行ヘルパーを有効にする

プロジェクトのgradle.propertiesファイルで、以下のGradleプロパティを設定して、ヘルパー付きのDGP v2をアクティベートします。

text
org.jetbrains.dokka.experimental.gradle.pluginMode=V2EnabledWithHelpers

TIP

プロジェクトにgradle.propertiesファイルがない場合は、プロジェクトのルートディレクトリに作成してください。

このプロパティは、移行ヘルパー付きのDGP v2プラグインをアクティベートします。これらのヘルパーは、ビルドスクリプトがDGP v2で利用できなくなったDGP v1のタスクを参照した場合に発生するコンパイルエラーを防ぎます。

NOTE

移行ヘルパーは、移行を積極的に支援するものではありません。これらは、新しいAPIに移行する間、ビルドスクリプトが破損しないようにするだけです。

移行が完了したら、移行ヘルパーを無効にします

プロジェクトをGradleと同期する

DGP v2と移行ヘルパーを有効にした後、Gradleとプロジェクトを同期して、DGP v2が適切に適用されていることを確認します。

  • IntelliJ IDEAを使用している場合は、GradleツールウィンドウですべてのGradleプロジェクトをリロード Reload button ボタンをクリックします。
  • Android Studioを使用している場合は、File | Sync Project with Gradle Files を選択します。

プロジェクトを移行する

Dokka Gradleプラグインをv2に更新した後、プロジェクトに適用可能な移行手順に従ってください。

設定オプションを調整する

DGP v2はGradleの設定オプションにいくつかの変更を導入しています。build.gradle.ktsファイルで、プロジェクトの設定に合わせて設定オプションを調整してください。

DGP v2のトップレベルDSL設定

DGP v1の設定構文を、DGP v2のトップレベルdokka {} DSL設定に置き換えます。

DGP v1での設定:

kotlin
tasks.withType<DokkaTask>().configureEach {
    suppressInheritedMembers.set(true)
    failOnWarning.set(true)
    dokkaSourceSets {
        named("main") {
            moduleName.set("Project Name")
            includes.from("README.md")
            sourceLink {
                localDirectory.set(file("src/main/kotlin"))
                remoteUrl.set(URL("https://example.com/src"))
                remoteLineSuffix.set("#L")
            }
        }
    }
}

tasks.dokkaHtml {
    pluginConfiguration<DokkaBase, DokkaBaseConfiguration> {
        customStyleSheets.set(listOf("styles.css"))
        customAssets.set(listOf("logo.png"))
        footerMessage.set("(c) Your Company")
    }
}

DGP v2での設定:

build.gradle.ktsファイルの構文は、GradleのKotlin DSLが型安全なアクセサーを使用しているため、通常の.ktファイル(カスタムGradleプラグインなどで使用されるものなど)とは異なります。

kotlin
// build.gradle.kts

dokka {
    moduleName.set("Project Name")
    dokkaPublications.html {
        suppressInheritedMembers.set(true)
        failOnWarning.set(true)
    }
    dokkaSourceSets.main {
        includes.from("README.md")
        sourceLink {
            localDirectory.set(file("src/main/kotlin"))
            remoteUrl("https://example.com/src")
            remoteLineSuffix.set("#L")
        }
    }
    pluginsConfiguration.html {
        customStyleSheets.from("styles.css")
        customAssets.from("logo.png")
        footerMessage.set("(c) Your Company")
    }
}
kotlin
// CustomPlugin.kt

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.dokka.gradle.DokkaExtension
import org.jetbrains.dokka.gradle.engine.plugins.DokkaHtmlPluginParameters

abstract class CustomPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        project.plugins.apply("org.jetbrains.dokka")

        project.extensions.configure(DokkaExtension::class.java) { dokka ->

            dokka.dokkaPublications.named("html") { publication ->
                publication.suppressInheritedMembers.set(true)
                publication.failOnWarning.set(true)
            }

            dokka.dokkaSourceSets.named("main") { dss ->
                dss.includes.from("README.md")
                dss.sourceLink {
                    it.localDirectory.set(project.file("src/main/kotlin"))
                    it.remoteUrl("https://example.com/src")
                    it.remoteLineSuffix.set("#L")
                }
            }

            dokka.pluginsConfiguration.named("html", DokkaHtmlPluginParameters::class.java) { html ->
                html.customStyleSheets.from("styles.css")
                html.customAssets.from("logo.png")
                html.footerMessage.set("(c) Your Company")
            }
        }
    }
}

可視性設定

documentedVisibilitiesプロパティをVisibility.PUBLICからVisibilityModifier.Publicに設定します。

DGP v1での設定:

kotlin
import org.jetbrains.dokka.DokkaConfiguration.Visibility

// ...
documentedVisibilities.set(
    setOf(Visibility.PUBLIC)
)

DGP v2での設定:

kotlin
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier

// ...
documentedVisibilities.set(
    setOf(VisibilityModifier.Public)
)

// OR

documentedVisibilities(VisibilityModifier.Public)

さらに、DGP v2のユーティリティ関数を使用して、ドキュメント化された可視性を追加します。

kotlin
fun documentedVisibilities(vararg visibilities: VisibilityModifier): Unit =
    documentedVisibilities.set(visibilities.asList())

ソースリンク

生成されたドキュメントからリモートリポジトリ内の対応するソースコードへナビゲートできるように、ソースリンクを設定します。この設定にはdokkaSourceSets.main{}ブロックを使用します。

DGP v1での設定:

kotlin
tasks.withType<DokkaTask>().configureEach {
    dokkaSourceSets {
        named("main") {
            sourceLink {
                localDirectory.set(file("src/main/kotlin"))
                remoteUrl.set(URL("https://github.com/your-repo"))
                remoteLineSuffix.set("#L")
            }
        }
    }
}

DGP v2での設定:

build.gradle.ktsファイルの構文は、GradleのKotlin DSLが型安全なアクセサーを使用しているため、通常の.ktファイル(カスタムGradleプラグインなどで使用されるものなど)とは異なります。

kotlin
// build.gradle.kts

dokka {
    dokkaSourceSets.main {
        sourceLink {
            localDirectory.set(file("src/main/kotlin"))
            remoteUrl("https://github.com/your-repo")
            remoteLineSuffix.set("#L")
        }
    }
}
kotlin
// CustomPlugin.kt

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.dokka.gradle.DokkaExtension

abstract class CustomPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        project.plugins.apply("org.jetbrains.dokka")
        project.extensions.configure(DokkaExtension::class.java) { dokka ->
            dokka.dokkaSourceSets.named("main") { dss ->
                dss.includes.from("README.md")
                dss.sourceLink {
                    it.localDirectory.set(project.file("src/main/kotlin"))
                    it.remoteUrl("https://example.com/src")
                    it.remoteLineSuffix.set("#L")
                }
            }
        }
    }
}

ソースリンクの設定が変更されたため、リモートURLを指定するにはURLクラスの代わりにURIクラスを使用してください。

DGP v1での設定:

kotlin
remoteUrl.set(URL("https://github.com/your-repo"))

DGP v2での設定:

kotlin
remoteUrl.set(URI("https://github.com/your-repo"))

// or

remoteUrl("https://github.com/your-repo")

さらに、DGP v2にはURLを設定するための2つのユーティリティ関数があります。

kotlin
fun remoteUrl(@Language("http-url-reference") value: String): Unit =
    remoteUrl.set(URI(value))

// and

fun remoteUrl(value: Provider<String>): Unit =
    remoteUrl.set(value.map(::URI))

外部リンク

register()メソッドを使用して外部リンクを登録し、各リンクを定義します。externalDocumentationLinks APIは、Gradle DSLの規約に合わせてこのメソッドを使用します。

DGP v1での設定:

kotlin
tasks.dokkaHtml {
    dokkaSourceSets {
        configureEach {
            externalDocumentationLink {
                url = URL("https://example.com/docs/")
                packageListUrl = File("/path/to/package-list").toURI().toURL()
            }
        }
    }
}

DGP v2での設定:

kotlin
dokka {
    dokkaSourceSets.configureEach {
        externalDocumentationLinks.register("example-docs") {
            url("https://example.com/docs/")
            packageListUrl("https://example.com/docs/package-list")
        }
    }
}

カスタムアセット

customAssetsプロパティをリスト(var List<File>)ではなく、ファイルのコレクション(FileCollection)とともに使用します。

DGP v1での設定:

kotlin
customAssets = listOf(file("example.png"), file("example2.png"))

DGP v2での設定:

kotlin
customAssets.from("example.png", "example2.png")

出力ディレクトリ

dokka {}ブロックを使用して、生成されたDokkaドキュメントの出力ディレクトリを指定します。

DGP v1での設定:

kotlin
tasks.dokkaHtml {
    outputDirectory.set(layout.buildDirectory.dir("dokkaDir"))
}

DGP v2での設定:

kotlin
dokka {
    dokkaPublications.html {
        outputDirectory.set(layout.buildDirectory.dir("dokkaDir"))
    }
}

追加ファイルの出力ディレクトリ

単一モジュールプロジェクトとマルチモジュールプロジェクトの両方で、dokka {}ブロック内に、出力ディレクトリを指定し、追加ファイルを含めます。

DGP v2では、単一モジュールプロジェクトとマルチモジュールプロジェクトの設定が統合されています。dokkaHtmlタスクとdokkaHtmlMultiModuleタスクを個別に設定する代わりに、dokka {}ブロック内のdokkaPublications.html {}で設定を指定します。

マルチモジュールプロジェクトの場合、ルートプロジェクトの設定で出力ディレクトリを設定し、追加ファイル(README.mdなど)を含めます。

DGP v1での設定:

kotlin
tasks.dokkaHtmlMultiModule {
    outputDirectory.set(rootDir.resolve("docs/api/0.x"))
    includes.from(project.layout.projectDirectory.file("README.md"))
}

DGP v2での設定:

build.gradle.ktsファイルの構文は、GradleのKotlin DSLが型安全なアクセサーを使用しているため、通常の.ktファイル(カスタムGradleプラグインなどで使用されるものなど)とは異なります。

kotlin
// build.gradle.kts

dokka {
    dokkaPublications.html {
        outputDirectory.set(rootDir.resolve("docs/api/0.x"))
        includes.from(project.layout.projectDirectory.file("README.md"))
    }
}
kotlin
// CustomPlugin.kt

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.dokka.gradle.DokkaExtension

abstract class CustomPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        project.plugins.apply("org.jetbrains.dokka")
        project.extensions.configure(DokkaExtension::class.java) { dokka ->
            dokka.dokkaPublications.named("html") { html ->
                html.outputDirectory.set(project.rootDir.resolve("docs/api/0.x"))
                html.includes.from(project.layout.projectDirectory.file("README.md"))
            }
        }
    }
}

Dokkaプラグインを設定する

組み込みのDokkaプラグインをJSONで設定する方法は非推奨となり、型安全なDSLが推奨されます。この変更により、Gradleのインクリメンタルビルドシステムとの互換性が向上し、タスク入力の追跡が改善されます。

DGP v1での設定:

DGP v1では、DokkaプラグインはJSONを使用して手動で設定されていました。このアプローチは、Gradleの最新チェックのためのタスク入力の登録で問題を引き起こしていました。

以下は、非推奨のJSONベースのDokka Versioningプラグインの設定例です。

kotlin
tasks.dokkaHtmlMultiModule {
    pluginsMapConfiguration.set(
        mapOf(
            "org.jetbrains.dokka.versioning.VersioningPlugin" to """
                { "version": "1.2", "olderVersionsDir": "$projectDir/dokka-docs" }
                """.trimIndent()
        )
    )
}

DGP v2での設定:

DGP v2では、Dokkaプラグインは型安全なDSLを使用して設定されます。Dokkaプラグインを型安全な方法で設定するには、pluginsConfiguration{}ブロックを使用します。

kotlin
dokka {
    pluginsConfiguration {
        versioning {
            version.set("1.2")
            olderVersionsDir.set(projectDir.resolve("dokka-docs"))
        }
    }
}

DGP v2設定の例については、Dokkaのバージョン管理プラグインを参照してください。

Dokka 2.0.0では、カスタムプラグインを設定することで機能を拡張できます。カスタムプラグインは、ドキュメント生成プロセスへの追加処理や変更を可能にします。

モジュール間でDokka設定を共有する

DGP v2では、モジュール間で設定を共有するためにsubprojects {}allprojects {}を使用するアプローチから移行しています。将来のGradleバージョンでは、これらのアプローチを使用するとエラーにつながる可能性があります。

既存のコンベンションプラグインを使用するか、コンベンションプラグインを使用しないマルチモジュールプロジェクトでDokka設定を適切に共有するには、以下の手順に従ってください。

Dokka設定を共有した後、複数のモジュールからのドキュメントを1つの出力に集約できます。詳細については、マルチモジュールプロジェクトでのドキュメント集約の更新を参照してください。

TIP

マルチモジュールプロジェクトの例については、Dokka GitHubリポジトリを参照してください。

コンベンションプラグインを使用しないマルチモジュールプロジェクト

プロジェクトがコンベンションプラグインを使用していない場合でも、各モジュールを直接設定することでDokka設定を共有できます。これには、各モジュールのbuild.gradle.ktsファイルで共有設定を手動でセットアップすることが含まれます。このアプローチは集中度が低いものの、コンベンションプラグインのような追加のセットアップは不要です。

そうでない場合、プロジェクトがコンベンションプラグインを使用している場合は、buildSrcディレクトリにコンベンションプラグインを作成し、そのプラグインをモジュール(サブプロジェクト)に適用することで、マルチモジュールプロジェクトでDokka設定を共有することもできます。

buildSrcディレクトリをセットアップする
  1. プロジェクトのルートに、buildSrcディレクトリを作成し、以下の2つのファイルを含めます。

    • settings.gradle.kts
    • build.gradle.kts
  2. buildSrc/settings.gradle.ktsファイルに、以下のスニペットを追加します。

    kotlin
    rootProject.name = "buildSrc"
  3. buildSrc/build.gradle.ktsファイルに、以下のスニペットを追加します。

    kotlin
    plugins {
        `kotlin-dsl`
    }
    
    repositories {
        mavenCentral()
        gradlePluginPortal()
    }
    
    dependencies {
        implementation("org.jetbrains.dokka:dokka-gradle-plugin:2.0.0")
    }
Dokkaコンベンションプラグインをセットアップする

buildSrcディレクトリをセットアップした後:

  1. コンベンションプラグインをホストするbuildSrc/src/main/kotlin/dokka-convention.gradle.ktsファイルを作成します。

  2. dokka-convention.gradle.ktsファイルに、以下のスニペットを追加します。

    kotlin
    plugins {
        id("org.jetbrains.dokka")
    }
    
    dokka {
        // The shared configuration goes here
    }

    dokka {}ブロック内に、すべてのサブプロジェクトに共通の共有Dokka設定を追加する必要があります。 また、Dokkaのバージョンを指定する必要はありません。バージョンはbuildSrc/build.gradle.ktsファイルですでに設定されています。

コンベンションプラグインをモジュールに適用する

Dokkaコンベンションプラグインを各サブプロジェクトのbuild.gradle.ktsファイルに追加することで、モジュール(サブプロジェクト)全体に適用します。

kotlin
plugins {
    id("dokka-convention")
}

コンベンションプラグインを使用するマルチモジュールプロジェクト

すでにコンベンションプラグインがある場合は、Gradleのドキュメントに従って、専用のDokkaコンベンションプラグインを作成します。

その後、Dokkaコンベンションプラグインのセットアップモジュール全体への適用の手順に従ってください。

マルチモジュールプロジェクトでのドキュメント集約を更新する

Dokkaは、複数のモジュール(サブプロジェクト)からのドキュメントを1つの出力または成果物に集約できます。

説明したように、ドキュメントを集約する前に、すべてのドキュメント可能なサブプロジェクトにDokkaプラグインを適用してください。

DGP v2での集約は、タスクではなくdependencies {}ブロックを使用し、任意のbuild.gradle.ktsファイルに追加できます。

DGP v1では、集約はルートプロジェクトで暗黙的に作成されていました。DGP v2でこの動作を再現するには、ルートプロジェクトのbuild.gradle.ktsファイルにdependencies {}ブロックを追加します。

DGP v1での集約:

kotlin
    tasks.dokkaHtmlMultiModule {
        // ...
    }

DGP v2での集約:

kotlin
dependencies {
    dokka(project(":some-subproject:"))
    dokka(project(":another-subproject:"))
}

集約されたドキュメントのディレクトリを変更する

DGPがモジュールを集約する場合、各サブプロジェクトは集約されたドキュメント内に独自のサブディレクトリを持ちます。

DGP v2では、集約メカニズムがGradleの規約により密接に適合するように更新されました。DGP v2は、任意の場所でドキュメントを集約する際の競合を防ぐために、サブプロジェクトのフルディレクトリを保持するようになりました。

DGP v1での集約ディレクトリ:

DGP v1では、集約されたドキュメントは折りたたまれたディレクトリ構造に配置されていました。例えば、:turbo-libに集約があり、:turbo-lib:mathsというネストされたサブプロジェクトを持つプロジェクトの場合、生成されたドキュメントは以下に配置されていました。

text
turbo-lib/build/dokka/html/maths/

DGP v2での集約ディレクトリ:

DGP v2は、完全なプロジェクト構造を保持することで、各サブプロジェクトが固有のディレクトリを持つことを保証します。同じ集約されたドキュメントは現在、この構造に従います。

text
turbo-lib/build/dokka/html/turbo-lib/maths/

この変更により、同じ名前のサブプロジェクトが衝突するのを防ぎます。ただし、ディレクトリ構造が変更されたため、外部リンクが古くなり、404エラーを引き起こす可能性があります。

DGP v1のディレクトリ動作に戻す

プロジェクトがDGP v1で使用されていたディレクトリ構造に依存している場合、モジュールディレクトリを手動で指定することでこの動作を元に戻すことができます。各サブプロジェクトのbuild.gradle.ktsファイルに以下の設定を追加します。

kotlin
// /turbo-lib/maths/build.gradle.kts

plugins {
    id("org.jetbrains.dokka")
}

dokka {
    // Overrides the module directory to match the V1 structure
    modulePath.set("maths")
}

更新されたタスクでドキュメントを生成する

DGP v2では、APIドキュメントを生成するGradleタスクの名前が変更されました。

DGP v1でのタスク:

text
./gradlew dokkaHtml

// or

./gradlew dokkaHtmlMultiModule

DGP v2でのタスク:

text
./gradlew :dokkaGenerate

dokkaGenerateタスクは、build/dokka/ディレクトリにAPIドキュメントを生成します。

DGP v2バージョンでは、dokkaGenerateタスク名は単一モジュールプロジェクトとマルチモジュールプロジェクトの両方で機能します。HTML、Javadoc、またはHTMLとJavadocの両方の形式で出力を生成するために、異なるタスクを使用できます。詳細については、ドキュメント出力形式の選択を参照してください。

ドキュメント出力形式を選択する

NOTE

Javadoc出力形式はアルファ版 (Alpha)です。

使用中にバグや移行の問題が発生する可能性があります。Javadocを入力として受け入れるツールとの統合が成功することは保証されません。自己責任でご使用ください。

DGP v2のデフォルト出力形式はHTMLです。ただし、APIドキュメントをHTML、Javadoc、または両方の形式で同時に生成することもできます。

  1. プロジェクトのbuild.gradle.ktsファイルのplugins {}ブロックに、対応するプラグインidを配置します。

    kotlin
    plugins {
        // Generates HTML documentation
        id("org.jetbrains.dokka") version "2.0.0"
    
        // Generates Javadoc documentation
        id("org.jetbrains.dokka-javadoc") version "2.0.0"
    
        // Keeping both plugin IDs generates both formats
    }
  2. 対応するGradleタスクを実行します。

以下は、各形式に対応するプラグインidとGradleタスクのリストです。

HTMLJavadoc両方
プラグインidid("org.jetbrains.dokka")id("org.jetbrains.dokka-javadoc")Use both HTML and Javadoc plugins
Gradleタスク./gradlew :dokkaGeneratePublicationHtml./gradlew :dokkaGeneratePublicationJavadoc./gradlew :dokkaGenerate

TIP

dokkaGenerateタスクは、適用されているプラグインに基づいて、利用可能なすべての形式でドキュメントを生成します。HTMLプラグインとJavadocプラグインの両方が適用されている場合、dokkaGeneratePublicationHtmlタスクを実行してHTMLのみを生成するか、dokkaGeneratePublicationJavadocタスクを実行してJavadocのみを生成するかを選択できます。

非推奨と削除に対応する

  • 出力形式のサポート: Dokka 2.0.0はHTMLとJavadoc出力のみをサポートしています。MarkdownやJekyllのような実験的な形式はサポートされなくなりました。
  • コレクタータスク: DokkaCollectorTaskは削除されました。これからは、各サブプロジェクトのドキュメントを個別に生成し、必要に応じてドキュメントを集約する必要があります。

移行を完了する

プロジェクトの移行が完了したら、これらの手順を実行して最終的な設定とパフォーマンスの向上を行います。

オプトインフラグを設定する

移行が成功した後、プロジェクトのgradle.propertiesファイルで、ヘルパーなしの以下のオプトインフラグを設定します。

text
org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled

DGP v2で利用できなくなったDGP v1のGradleタスクへの参照を削除した場合、それに関連するコンパイルエラーは発生しないはずです。

ビルドキャッシュとコンフィグレーションキャッシュを有効にする

DGP v2はGradleのビルドキャッシュとコンフィグレーションキャッシュをサポートするようになり、ビルドパフォーマンスが向上します。

トラブルシューティング

大規模なプロジェクトでは、Dokkaはドキュメントを生成するためにかなりの量のメモリを消費する可能性があります。これは、特に大量のデータを処理する場合に、Gradleのメモリ制限を超える可能性があります。

Dokkaの生成時にメモリ不足になると、ビルドは失敗し、Gradleはjava.lang.OutOfMemoryError: Metaspaceのような例外をスローする可能性があります。

Dokkaのパフォーマンスを向上させるための積極的な取り組みが進行中ですが、いくつかの制限はGradleに起因しています。

メモリの問題が発生した場合は、以下の回避策を試してください。

ヒープスペースを増やす

メモリの問題を解決する1つの方法は、Dokkaジェネレータープロセスに割り当てるJavaヒープメモリの量を増やすことです。build.gradle.ktsファイルで、以下の設定オプションを調整します。

kotlin
    dokka {
        // Dokka generates a new process managed by Gradle
        dokkaGeneratorIsolation = ProcessIsolation {
            // Configures heap size
            maxHeapSize = "4g"
        }
    }

この例では、最大ヒープサイズは4GB("4g")に設定されています。ビルドに最適な設定を見つけるために、値を調整してテストしてください。

例えば、Gradle自身のメモリ使用量よりも大幅に多くのDokkaヒープサイズが必要であることが判明した場合は、DokkaのGitHubリポジトリにイシューを作成してください

NOTE

この設定を各サブプロジェクトに適用する必要があります。すべてのサブプロジェクトに適用されるコンベンションプラグインでDokkaを設定することをお勧めします。

Gradleプロセス内でDokkaを実行する

GradleビルドとDokka生成の両方が多くのメモリを必要とする場合、それらは個別のプロセスとして実行され、単一のマシン上でかなりのメモリを消費する可能性があります。

メモリ使用量を最適化するには、Dokkaを個別のプロセスとしてではなく、同じGradleプロセス内で実行できます。これにより、各プロセスに個別にメモリを割り当てるのではなく、Gradleのメモリを一度設定することができます。

Dokkaを同じGradleプロセス内で実行するには、build.gradle.ktsファイルで以下の設定オプションを調整します。

kotlin
    dokka {
        // Runs Dokka in the current Gradle process
        dokkaGeneratorIsolation = ClassLoaderIsolation()
    }

ヒープスペースを増やす場合と同様に、この設定がプロジェクトでうまく機能することを確認するためにテストしてください。

GradleのJVMメモリの設定に関する詳細については、Gradleのドキュメントを参照してください。

NOTE

GradleのJavaオプションを変更すると、新しいGradleデーモンが起動し、長時間稼働し続ける可能性があります。他のGradleプロセスを手動で停止することができます。

さらに、ClassLoaderIsolation()設定に関するGradleのイシューがメモリリークを引き起こす可能性があります。

次のステップ