Gradleプロジェクトを構成する
Gradle を使用してKotlinプロジェクトをビルドするには、ビルドスクリプトファイル build.gradle(.kts)
にKotlin Gradleプラグインを追加し、そこでプロジェクトの依存関係を構成する必要があります。
ビルドスクリプトの内容についてさらに学ぶには、 「ビルドスクリプトを探索する」セクションを参照してください。
プラグインを適用する
Kotlin Gradleプラグインを適用するには、GradleプラグインDSLの plugins{}
ブロックを使用します。
plugins {
// Replace `<...>` with the plugin name appropriate for your target environment
kotlin("<...>") version "2.2.10"
// For example, if your target environment is JVM:
// kotlin("jvm") version "2.2.10"
}
plugins {
// Replace `<...>` with the plugin name appropriate for your target environment
id 'org.jetbrains.kotlin.<...>' version '2.2.10'
// For example, if your target environment is JVM:
// id 'org.jetbrains.kotlin.jvm' version '2.2.10'
}
Kotlin Gradleプラグイン (KGP) とKotlinは同じバージョン番号を共有します。
プロジェクトを構成する際、Kotlin Gradleプラグイン (KGP) と利用可能なGradleバージョンの互換性を確認してください。以下の表に、GradleとAndroid Gradleプラグイン (AGP) の最小および最大完全にサポートされているバージョンを示します。
KGP version | Gradle min and max versions | AGP min and max versions |
---|---|---|
2.2.0 | 7.6.3–8.14 | 7.3.1–8.10.0 |
2.1.20–2.1.21 | 7.6.3–8.12.1 | 7.3.1–8.7.2 |
2.1.0–2.1.10 | 7.6.3–8.10* | 7.3.1–8.7.2 |
2.0.20–2.0.21 | 6.8.3–8.8* | 7.1.3–8.5 |
2.0.0 | 6.8.3–8.5 | 7.1.3–8.3.1 |
1.9.20–1.9.25 | 6.8.3–8.1.1 | 4.2.2–8.1.0 |
1.9.0–1.9.10 | 6.8.3–7.6.0 | 4.2.2–7.4.0 |
1.8.20–1.8.22 | 6.8.3–7.6.0 | 4.1.3–7.4.0 |
1.8.0–1.8.11 | 6.8.3–7.3.3 | 4.1.3–7.2.1 |
1.7.20–1.7.22 | 6.7.1–7.1.1 | 3.6.4–7.0.4 |
1.7.0–1.7.10 | 6.7.1–7.0.2 | 3.4.3–7.0.2 |
1.6.20–1.6.21 | 6.1.1–7.0.2 | 3.4.3–7.0.2 |
*Kotlin 2.0.20–2.0.21およびKotlin 2.1.0–2.1.10は、Gradle 8.6まで完全に互換性があります。 Gradleバージョン8.7–8.10もサポートされていますが、1つだけ例外があります。Kotlin Multiplatform Gradleプラグインを使用している場合、 JVMターゲットで
withJava()
関数を呼び出すマルチプラットフォームプロジェクトで非推奨の警告が表示されることがあります。 詳細については、デフォルトで作成されるJavaソースセットを参照してください。
GradleおよびAGPバージョンは最新リリースまで使用できますが、その場合、非推奨の警告に遭遇したり、一部の新機能が動作しない可能性があることに留意してください。
例えば、Kotlin Gradleプラグインおよびkotlin-multiplatform
プラグイン 2.2.10 は、プロジェクトをコンパイルするために最低限のGradleバージョンとして 7.6.3 を必要とします。
同様に、最大の完全にサポートされているバージョンは 8.14 です。これは非推奨のGradleメソッドやプロパティを持たず、現在のすべてのGradle機能をサポートしています。
プロジェクト内のKotlin Gradleプラグインデータ
デフォルトでは、Kotlin Gradleプラグインは永続的なプロジェクト固有のデータをプロジェクトのルートにある.kotlin
ディレクトリに保存します。
.kotlin
ディレクトリをバージョン管理にコミットしないでください。 例えば、Gitを使用している場合、プロジェクトの.gitignore
ファイルに.kotlin
を追加してください。
この動作を構成するために、プロジェクトのgradle.properties
ファイルに追加できるプロパティがあります。
Gradle property | Description |
---|---|
kotlin.project.persistent.dir | プロジェクトレベルのデータが保存される場所を構成します。デフォルト: <project-root-directory>/.kotlin |
kotlin.project.persistent.dir.gradle.disableWrite | .gradle ディレクトリへのKotlinデータの書き込みを無効にするかどうかを制御します(古いIDEAバージョンとの下位互換性のため)。デフォルト: false |
JVMをターゲットにする
JVMをターゲットにするには、Kotlin JVMプラグインを適用します。
plugins {
kotlin("jvm") version "2.2.10"
}
plugins {
id "org.jetbrains.kotlin.jvm" version "2.2.10"
}
このブロックのversion
はリテラルであるべきであり、他のビルドスクリプトから適用することはできません。
KotlinとJavaのソース
KotlinソースとJavaソースは同じディレクトリに保存することも、異なるディレクトリに配置することもできます。
デフォルトの規約では、異なるディレクトリを使用します。
project
- src
- main (root)
- kotlin
- java
src/*/kotlin
ディレクトリにJavaの.java
ファイルを保存しないでください。.java
ファイルはコンパイルされません。代わりに、
src/main/java
を使用できます。
デフォルトの規約を使用しない場合、対応するsourceSets
プロパティを更新する必要があります。
sourceSets.main {
java.srcDirs("src/main/myJava", "src/main/myKotlin")
}
sourceSets {
main.kotlin.srcDirs += 'src/main/myKotlin'
main.java.srcDirs += 'src/main/myJava'
}
関連するコンパイルタスクのJVMターゲット互換性の確認
ビルドモジュールには、関連するコンパイルタスクがある場合があります。例えば、次のとおりです。
compileKotlin
とcompileJava
compileTestKotlin
とcompileTestJava
main
とtest
ソースセットのコンパイルタスクは関連していません。
このような関連するタスクの場合、Kotlin GradleプラグインはJVMターゲットの互換性をチェックします。kotlin
拡張またはタスクの jvmTarget
属性と、java
拡張またはタスクの targetCompatibility
の値が異なる場合、JVMターゲットの非互換性が発生します。例えば、compileKotlin
タスクにjvmTarget=1.8
があり、compileJava
タスクにtargetCompatibility=15
がある(または継承している)場合などです。
このチェックの動作をプロジェクト全体に対して構成するには、gradle.properties
ファイルでkotlin.jvm.target.validation.mode
プロパティを次のように設定します。
error
– プラグインがビルドを失敗させます。Gradle 8.0+のプロジェクトのデフォルト値です。warning
– プラグインが警告メッセージを出力します。Gradle 8.0未満のプロジェクトのデフォルト値です。ignore
– プラグインがチェックをスキップし、メッセージを出力しません。
build.gradle(.kts)
ファイルでタスクレベルで構成することもできます。
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile>().configureEach {
jvmTargetValidationMode.set(org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode.WARNING)
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile.class).configureEach {
jvmTargetValidationMode = org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode.WARNING
}
JVMターゲットの非互換性を避けるには、ツールチェーンを構成するか、JVMバージョンを手動で調整します。
ターゲットに互換性がない場合に発生しうる問題
KotlinおよびJavaソースセットのJVMターゲットを手動で設定する方法は2つあります。
- Javaツールチェーンを設定することによる暗黙的な方法。
kotlin
拡張またはタスクでjvmTarget
属性を、java
拡張またはタスクでtargetCompatibility
を明示的に設定することによる方法。
JVMターゲットの非互換性は、次の場合に発生します。
jvmTarget
とtargetCompatibility
に異なる値を明示的に設定した場合。- デフォルト設定で、JDKが
1.8
と等しくない場合。
ビルドスクリプトにKotlin JVMプラグインのみがあり、JVMターゲットに対する追加設定がない場合のJVMターゲットのデフォルト設定を考えてみましょう。
plugins {
kotlin("jvm") version "2.2.10"
}
plugins {
id "org.jetbrains.kotlin.jvm" version "2.2.10"
}
ビルドスクリプトにjvmTarget
値に関する明示的な情報がない場合、そのデフォルト値はnull
であり、コンパイラはそれをデフォルト値1.8
に変換します。targetCompatibility
は現在のGradleのJDKバージョンと等しく、これはあなたのJDKバージョンと等しくなります(Javaツールチェーンアプローチを使用しない限り)。あなたのJDKバージョンが17
であると仮定すると、公開されたライブラリアーティファクトはJDK 17+との互換性を宣言します: org.gradle.jvm.version=17
。これは間違っています。この場合、バイトコードのバージョンが1.8
であるにもかかわらず、このライブラリを追加するためにメインプロジェクトでJava 17を使用する必要があります。この問題を解決するには、ツールチェーンを構成してください。
Gradle Javaツールチェーンのサポート
Androidユーザーへの警告。Gradleツールチェーンのサポートを使用するには、Android Gradleプラグイン (AGP) バージョン8.1.0-alpha09以降を使用してください。
Gradle Javaツールチェーンのサポートは、AGP 7.4.0以降で利用可能です。 それにもかかわらず、この問題のため、AGPはバージョン8.1.0-alpha09まで
targetCompatibility
をツールチェーンのJDKと等しく設定しませんでした。 8.1.0-alpha09未満のバージョンを使用する場合、compileOptions
を介してtargetCompatibility
を手動で構成する必要があります。 プレースホルダー<MAJOR_JDK_VERSION>
を使用したいJDKバージョンに置き換えてください。kotlinandroid { compileOptions { sourceCompatibility = <MAJOR_JDK_VERSION> targetCompatibility = <MAJOR_JDK_VERSION> } }
Gradle 6.7では、Javaツールチェーンのサポートが導入されました。この機能を使用すると、次のことができます。
- コンパイル、テスト、および実行可能ファイルを実行するために、Gradle内のものとは異なるJDKとJREを使用する。
- まだリリースされていない言語バージョンでコードをコンパイルおよびテストする。
ツールチェーンのサポートにより、GradleはローカルJDKを自動検出し、ビルドのためにGradleが必要とする不足しているJDKをインストールできます。これでGradle自体はどのJDK上でも実行でき、主要なJDKバージョンに依存するタスクのリモートビルドキャッシュ機能を再利用できます。
Kotlin Gradleプラグインは、Kotlin/JVMコンパイルタスクに対してJavaツールチェーンをサポートします。JSおよびNativeタスクはツールチェーンを使用しません。Kotlinコンパイラは常にGradleデーモンが実行されているJDK上で実行されます。 Javaツールチェーンは次のことを行います。
- JVMターゲットで利用可能な
-jdk-home
オプションを設定します。 - ユーザーが
jvmTarget
オプションを明示的に設定しない場合、compilerOptions.jvmTarget
をツールチェーンのJDKバージョンに設定します。ユーザーがツールチェーンを構成しない場合、jvmTarget
フィールドはデフォルト値を使用します。JVMターゲットの互換性についてさらに学ぶ。 - Javaのコンパイル、テスト、およびjavadocタスクによって使用されるツールチェーンを設定します。
kapt
ワーカーがどのJDKで実行されるかに影響します。
ツールチェーンを設定するには、以下のコードを使用します。プレースホルダー<MAJOR_JDK_VERSION>
を使用したいJDKバージョンに置き換えてください。
kotlin {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>))
}
// Or shorter:
jvmToolchain(<MAJOR_JDK_VERSION>)
// For example:
jvmToolchain(17)
}
kotlin {
jvmToolchain {
languageVersion = JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)
}
// Or shorter:
jvmToolchain(<MAJOR_JDK_VERSION>)
// For example:
jvmToolchain(17)
}
kotlin
拡張を介してツールチェーンを設定すると、Javaコンパイルタスクのツールチェーンも更新されることに注意してください。
java
拡張を介してツールチェーンを設定でき、Kotlinコンパイルタスクはそれを使用します。
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>))
}
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)
}
}
Gradle 8.0.2以降を使用している場合は、ツールチェーンリゾルバープラグインも追加する必要があります。この種のプラグインは、ツールチェーンをダウンロードするリポジトリを管理します。例として、settings.gradle(.kts)
に以下のプラグインを追加してください。
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version("0.9.0")
}
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.9.0'
}
foojay-resolver-convention
のバージョンがGradleサイトのGradleバージョンに対応していることを確認してください。
Gradleがどのツールチェーンを使用しているかを理解するには、ログレベル
--info
でGradleビルドを実行し、出力で[KOTLIN] Kotlin compilation 'jdkHome' argument:
で始まる文字列を見つけてください。 コロンの後の部分が、ツールチェーンからのJDKバージョンになります。
特定のタスクに任意のJDK(ローカルなものも含む)を設定するには、Task DSLを使用します。
KotlinプラグインでのGradle JVMツールチェーンのサポートについてさらに学ぶ。
Task DSLでJDKバージョンを設定する
Task DSLを使用すると、UsesKotlinJavaToolchain
インターフェースを実装する任意のタスクに対して、任意のJDKバージョンを設定できます。現在、これらのタスクはKotlinCompile
とKaptTask
です。Gradleに主要なJDKバージョンを検索させたい場合は、ビルドスクリプトの<MAJOR_JDK_VERSION>
プレースホルダーを置き換えてください。
val service = project.extensions.getByType<JavaToolchainService>()
val customLauncher = service.launcherFor {
languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>))
}
project.tasks.withType<UsesKotlinJavaToolchain>().configureEach {
kotlinJavaToolchain.toolchain.use(customLauncher)
}
JavaToolchainService service = project.getExtensions().getByType(JavaToolchainService.class)
Provider<JavaLauncher> customLauncher = service.launcherFor {
it.languageVersion = JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)
}
tasks.withType(UsesKotlinJavaToolchain::class).configureEach { task ->
task.kotlinJavaToolchain.toolchain.use(customLauncher)
}
または、ローカルJDKへのパスを指定し、プレースホルダー<LOCAL_JDK_VERSION>
をこのJDKバージョンに置き換えることができます。
tasks.withType<UsesKotlinJavaToolchain>().configureEach {
kotlinJavaToolchain.jdk.use(
"/path/to/local/jdk", // Put a path to your JDK
JavaVersion.<LOCAL_JDK_VERSION> // For example, JavaVersion.17
)
}
コンパイラタスクを関連付ける
コンパイルを_関連付け_ることで、あるコンパイルが別のコンパイルのコンパイル済み出力を使用するような関係をそれらの間に設定できます。コンパイルを関連付けることで、それらの間にinternal
の可視性が確立されます。
Kotlinコンパイラは、デフォルトで一部のコンパイルを関連付けます。例えば、各ターゲットのtest
とmain
コンパイルなどです。カスタムコンパイルの1つが別のコンパイルと接続されていることを表現する必要がある場合は、独自の関連付けられたコンパイルを作成します。
IDEがソースセット間の可視性を推論するために、関連するコンパイルをサポートするようにするには、build.gradle(.kts)
に以下のコードを追加してください。
val integrationTestCompilation = kotlin.target.compilations.create("integrationTest") {
associateWith(kotlin.target.compilations.getByName("main"))
}
integrationTestCompilation {
kotlin.target.compilations.create("integrationTest") {
associateWith(kotlin.target.compilations.getByName("main"))
}
}
ここでは、integrationTest
コンパイルがmain
コンパイルと関連付けられており、関数テストからのinternal
オブジェクトへのアクセスを提供します。
Java Modules (JPMS) を有効にして構成する
Kotlin GradleプラグインがJava Modulesで動作するようにするには、ビルドスクリプトに以下の行を追加し、YOUR_MODULE_NAME
をJPMSモジュールへの参照(例: org.company.module
)に置き換えてください。
// Add the following three lines if you use a Gradle version less than 7.0
java {
modularity.inferModulePath.set(true)
}
tasks.named("compileJava", JavaCompile::class.java) {
options.compilerArgumentProviders.add(CommandLineArgumentProvider {
// Provide compiled Kotlin classes to javac – needed for Java/Kotlin mixed sources to work
listOf("--patch-module", "YOUR_MODULE_NAME=${sourceSets["main"].output.asPath}")
})
}
// Add the following three lines if you use a Gradle version less than 7.0
java {
modularity.inferModulePath = true
}
tasks.named("compileJava", JavaCompile.class) {
options.compilerArgumentProviders.add(new CommandLineArgumentProvider() {
@Override
Iterable<String> asArguments() {
// Provide compiled Kotlin classes to javac – needed for Java/Kotlin mixed sources to work
return ["--patch-module", "YOUR_MODULE_NAME=${sourceSets["main"].output.asPath}"]
}
})
}
module-info.java
は通常通りsrc/main/java
ディレクトリに配置してください。モジュールの場合、「package is empty or does not exist」というビルド失敗を避けるため、Kotlinファイルのパッケージ名は
module-info.java
からのパッケージ名と等しくなければなりません。
詳細については、以下を参照してください。
その他の詳細
Kotlin/JVMについてさらに学ぶ。
コンパイルタスクでの成果物の使用を無効にする
まれなシナリオでは、循環依存関係エラーによってビルド失敗が発生する可能性があります。例えば、複数のコンパイルがあり、あるコンパイルが別のコンパイルのすべての内部宣言を見ることができ、生成された成果物が両方のコンパイルタスクの出力に依存している場合などです。
FAILURE: Build failed with an exception.
What went wrong:
Circular dependency between the following tasks:
:lib:compileKotlinJvm
--- :lib:jvmJar
\--- :lib:compileKotlinJvm (*)
(*) - details omitted (listed previously)
この循環依存関係エラーを修正するために、Gradleプロパティ archivesTaskOutputAsFriendModule
を追加しました。このプロパティは、コンパイルタスクでの成果物入力の使用を制御し、結果としてタスク依存関係が作成されるかどうかを決定します。
デフォルトでは、このプロパティはタスク依存関係を追跡するためにtrue
に設定されています。循環依存関係エラーに遭遇した場合、コンパイルタスクでの成果物の使用を無効にしてタスク依存関係を削除し、循環依存関係エラーを回避することができます。
コンパイルタスクでの成果物の使用を無効にするには、gradle.properties
ファイルに以下を追加してください。
kotlin.build.archivesTaskOutputAsFriendModule=false
遅延Kotlin/JVMタスク作成
Kotlin 1.8.20以降、Kotlin Gradleプラグインはすべてのタスクを登録し、ドライランではそれらを構成しません。
コンパイルタスクのdestinationDirectoryの非デフォルトロケーション
Kotlin/JVM KotlinJvmCompile
/KotlinCompile
タスクのdestinationDirectory
ロケーションをオーバーライドする場合、ビルドスクリプトを更新してください。JARファイル内のsourceSets.main.outputs
にsourceSets.main.kotlin.classesDirectories
を明示的に追加する必要があります。
tasks.jar(type: Jar) {
from sourceSets.main.outputs
from sourceSets.main.kotlin.classesDirectories
}
複数プラットフォームをターゲットにする
複数プラットフォームをターゲットとするプロジェクトは、マルチプラットフォームプロジェクトと呼ばれ、kotlin-multiplatform
プラグインを必要とします。
kotlin-multiplatform
プラグインは、Gradle 7.6.3以降で動作します。
plugins {
kotlin("multiplatform") version "2.2.10"
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '2.2.10'
}
異なるプラットフォーム向けKotlin MultiplatformおよびiOSとAndroid向けKotlin Multiplatformについてさらに学ぶ。
Androidをターゲットにする
Androidアプリケーションを作成するには、Android Studioを使用することをお勧めします。Android Gradleプラグインの使用方法を学ぶ。
JavaScriptをターゲットにする
JavaScriptをターゲットにする場合も、kotlin-multiplatform
プラグインを使用します。Kotlin/JSプロジェクトの設定についてさらに学ぶ
plugins {
kotlin("multiplatform") version "2.2.10"
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '2.2.10'
}
JavaScript用のKotlinおよびJavaソース
このプラグインはKotlinファイルのみで動作するため、KotlinファイルとJavaファイルを分離しておくことをお勧めします(プロジェクトにJavaファイルが含まれている場合)。別々に保存しない場合は、sourceSets{}
ブロックでソースフォルダを指定してください。
kotlin {
sourceSets["main"].apply {
kotlin.srcDir("src/main/myKotlin")
}
}
kotlin {
sourceSets {
main.kotlin.srcDirs += 'src/main/myKotlin'
}
}
KotlinBasePluginインターフェースによる構成アクションのトリガー
任意のKotlin Gradleプラグイン(JVM、JS、マルチプラットフォーム、Nativeなど)が適用されるたびに、いくつかの構成アクションをトリガーするには、すべてのKotlinプラグインが継承するKotlinBasePlugin
インターフェースを使用します。
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePlugin
// ...
project.plugins.withType<KotlinBasePlugin>() {
// Configure your action here
}
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePlugin
// ...
project.plugins.withType(KotlinBasePlugin.class) {
// Configure your action here
}
依存関係を構成する
ライブラリに依存関係を追加するには、ソースセットDSLのdependencies{}
ブロックで、必要なタイプの依存関係(例: implementation
)を設定します。
kotlin {
sourceSets {
commonMain.dependencies {
implementation("com.example:my-library:1.0")
}
}
}
kotlin {
sourceSets {
commonMain {
dependencies {
implementation 'com.example:my-library:1.0'
}
}
}
}
または、トップレベルで依存関係を設定することもできます。
依存関係のタイプ
要件に基づいて依存関係のタイプを選択してください。
タイプ | 説明 | 使用すべき場合 |
---|---|---|
api | コンパイル時と実行時の両方で使用され、ライブラリのコンシューマーにエクスポートされます。 | 依存関係からの型が現在のモジュールの公開APIで使用される場合、api 依存関係を使用します。 |
implementation | 現在のモジュールのコンパイル時と実行時に使用されますが、implementation 依存関係を持つモジュールに依存する他のモジュールのコンパイルには公開されません。 | モジュールの内部ロジックに必要な依存関係に使用します。 モジュールが公開されないエンドポイントアプリケーションである場合、 |
compileOnly | 現在のモジュールのコンパイルに使用され、実行時にも他のモジュールのコンパイル時にも利用できません。 | 実行時にサードパーティの実装が利用可能なAPIに使用します。 |
runtimeOnly | 実行時には利用可能ですが、どのモジュールのコンパイル時にも可視ではありません。 |
標準ライブラリへの依存関係
標準ライブラリ(stdlib
)への依存関係は、各ソースセットに自動的に追加されます。使用される標準ライブラリのバージョンは、Kotlin Gradleプラグインのバージョンと同じです。
プラットフォーム固有のソースセットの場合、対応するプラットフォーム固有のライブラリのバリアントが使用され、残りのソースセットには共通の標準ライブラリが追加されます。Kotlin Gradleプラグインは、GradleビルドスクリプトのcompilerOptions.jvmTarget
コンパイラオプションに応じて適切なJVM標準ライブラリを選択します。
標準ライブラリの依存関係を明示的に宣言する場合(例えば、異なるバージョンが必要な場合)、Kotlin Gradleプラグインはそれをオーバーライドしたり、2つ目の標準ライブラリを追加したりすることはありません。
標準ライブラリがまったく必要ない場合は、gradle.properties
ファイルに以下のGradleプロパティを追加できます。
kotlin.stdlib.default.dependency=false
遷移的な依存関係のバージョン調整
Kotlin標準ライブラリバージョン1.9.20以降、Gradleは標準ライブラリに含まれるメタデータを使用して、遷移的なkotlin-stdlib-jdk7
およびkotlin-stdlib-jdk8
の依存関係を自動的に調整します。
1.8.0~1.9.10のいずれかのKotlin標準ライブラリバージョンに対して依存関係を追加した場合(例: implementation("org.jetbrains.kotlin:kotlin-stdlib:1.8.0")
)、Kotlin Gradleプラグインは遷移的なkotlin-stdlib-jdk7
およびkotlin-stdlib-jdk8
の依存関係にこのKotlinバージョンを使用します。これにより、異なる標準ライブラリバージョンからのクラス重複が回避されます。kotlin-stdlib-jdk7
とkotlin-stdlib-jdk8
をkotlin-stdlib
にマージすることについてさらに学ぶ。この動作を無効にするには、gradle.properties
ファイルでkotlin.stdlib.jdk.variants.version.alignment
Gradleプロパティを使用します。
kotlin.stdlib.jdk.variants.version.alignment=false
その他のバージョン調整方法
バージョン調整に問題がある場合、Kotlin BOMを介してすべてのバージョンを調整できます。ビルドスクリプトで
kotlin-bom
へのプラットフォーム依存関係を宣言してください。kotlinimplementation(platform("org.jetbrains.kotlin:kotlin-bom:2.2.10"))
groovyimplementation platform('org.jetbrains.kotlin:kotlin-bom:2.2.10')
標準ライブラリバージョンに対する依存関係を追加しない場合でも、Kotlin標準ライブラリの異なる古いバージョンを遷移的に引き起こす2つの異なる依存関係がある場合は、これらの遷移的なライブラリの2.2.10バージョンを明示的に要求できます。
kotlindependencies { constraints { add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk7") { version { require("2.2.10") } } add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk8") { version { require("2.2.10") } } } }
groovydependencies { constraints { add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk7") { version { require("2.2.10") } } add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk8") { version { require("2.2.10") } } } }
Kotlin標準ライブラリバージョン 2.2.10 に対する依存関係(
implementation("org.jetbrains.kotlin:kotlin-stdlib:2.2.10")
)と、古いバージョン(1.8.0
より前)のKotlin Gradleプラグインを使用している場合、標準ライブラリのバージョンに合わせてKotlin Gradleプラグインを更新してください。kotlinplugins { // replace `<...>` with the plugin name kotlin("<...>") version "2.2.10" }
groovyplugins { // replace `<...>` with the plugin name id "org.jetbrains.kotlin.<...>" version "2.2.10" }
kotlin-stdlib-jdk7
/kotlin-stdlib-jdk8
の1.8.0
より前のバージョン(例:implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:SOME_OLD_KOTLIN_VERSION")
)を使用しており、かつkotlin-stdlib:1.8+
を遷移的に引き起こす依存関係がある場合は、kotlin-stdlib-jdk<7/8>:SOME_OLD_KOTLIN_VERSION
をkotlin-stdlib-jdk*:2.2.10
に置き換えるか、それを引き起こすライブラリから遷移的なkotlin-stdlib:1.8+
を除外してください。kotlindependencies { implementation("com.example:lib:1.0") { exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib") } }
groovydependencies { implementation("com.example:lib:1.0") { exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib" } }
テストライブラリに依存関係を設定する
kotlin.test
APIは、サポートされているすべてのプラットフォームでKotlinプロジェクトをテストするために利用できます。commonTest
ソースセットにkotlin-test
依存関係を追加すると、Gradleプラグインが各テストソースセットに対応するテスト依存関係を推論できるようになります。
Kotlin/Nativeターゲットは追加のテスト依存関係を必要とせず、kotlin.test
API実装は組み込まれています。
kotlin {
sourceSets {
commonTest.dependencies {
implementation(kotlin("test")) // This brings all the platform dependencies automatically
}
}
}
kotlin {
sourceSets {
commonTest {
dependencies {
implementation kotlin("test") // This brings all the platform dependencies automatically
}
}
}
}
Kotlinモジュールへの依存関係には短縮形を使用できます。例えば、"org.jetbrains.kotlin:kotlin-test"にはkotlin("test")を使用します。
kotlin-test
依存関係は、任意の共有ソースセットまたはプラットフォーム固有のソースセットでも使用できます。
kotlin-testのJVMバリアント
Kotlin/JVMの場合、GradleはデフォルトでJUnit 4を使用します。したがって、kotlin("test")
依存関係はJUnit 4のバリアント、すなわちkotlin-test-junit
に解決されます。
ビルドスクリプトのテストタスクで useJUnitPlatform()
または useTestNG()
を呼び出すことで、JUnit 5またはTestNGを選択できます。以下の例はKotlinマルチプラットフォームプロジェクトのものです。
kotlin {
jvm {
testRuns["test"].executionTask.configure {
useJUnitPlatform()
}
}
sourceSets {
commonTest.dependencies {
implementation(kotlin("test"))
}
}
}
kotlin {
jvm {
testRuns["test"].executionTask.configure {
useJUnitPlatform()
}
}
sourceSets {
commonTest {
dependencies {
implementation kotlin("test")
}
}
}
}
以下の例はJVMプロジェクトのものです。
dependencies {
testImplementation(kotlin("test"))
}
tasks {
test {
useTestNG()
}
}
dependencies {
testImplementation 'org.jetbrains.kotlin:kotlin-test'
}
test {
useTestNG()
}
自動JVMバリアント解決が設定に問題を引き起こす場合があります。その場合、必要なフレームワークを明示的に指定し、プロジェクトのgradle.properties
ファイルにこの行を追加することで自動解決を無効にできます。
kotlin.test.infer.jvm.variant=false
ビルドスクリプトでkotlin("test")
のバリアントを明示的に使用していて、プロジェクトのビルドが互換性競合で動作しなくなった場合は、互換性ガイドのこの問題を参照してください。
kotlinxライブラリに依存関係を設定する
マルチプラットフォームライブラリを使用し、共有コードに依存する必要がある場合は、共有ソースセットで一度だけ依存関係を設定します。kotlinx-coroutines-core
やktor-client-core
などのライブラリの基本アーティファクト名を使用してください。
kotlin {
sourceSets {
commonMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
}
}
}
kotlin {
sourceSets {
commonMain {
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2'
}
}
}
}
プラットフォーム固有の依存関係のためにkotlinxライブラリが必要な場合でも、対応するプラットフォームソースセットでライブラリの基本アーティファクト名を使用できます。
kotlin {
sourceSets {
jvmMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
}
}
}
kotlin {
sourceSets {
jvmMain {
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2'
}
}
}
}
トップレベルで依存関係を設定する
または、構成名に<sourceSetName><DependencyType>
というパターンを使用して、トップレベルで依存関係を指定できます。これは、ソースセットの依存関係DSLでは利用できないgradleApi()
、localGroovy()
、gradleTestKit()
などの一部のGradle組み込み依存関係に役立つ場合があります。
dependencies {
"commonMainImplementation"("com.example:my-library:1.0")
}
dependencies {
commonMainImplementation 'com.example:my-library:1.0'
}
リポジトリを宣言する
オープンソースの依存関係を使用するために、公開されているリポジトリを宣言できます。repositories{}
ブロックで、リポジトリの名前を設定します。
repositories {
mavenCentral()
}
repositories {
mavenCentral()
}
一般的なリポジトリはMaven CentralとGoogleのMavenリポジトリです。
Mavenプロジェクトも扱う場合、GradleとMavenプロジェクトを切り替える際に問題が発生する可能性があるため、
mavenLocal()
をリポジトリとして追加することを避けることをお勧めします。もしmavenLocal()
リポジトリを追加する必要がある場合は、repositories{}
ブロックの最後のリポジトリとして追加してください。詳細については、The case for mavenLocal()を参照してください。
複数のサブプロジェクトで同じリポジトリを宣言する必要がある場合は、settings.gradle(.kts)
ファイルのdependencyResolutionManagement{}
ブロックでリポジトリを一元的に宣言してください。
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}
サブプロジェクトで宣言されたリポジトリは、一元的に宣言されたリポジトリをオーバーライドします。この動作を制御する方法と利用可能なオプションに関する詳細については、Gradleのドキュメントを参照してください。
次のステップ
詳細については、以下を参照してください。