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.1.21"
// For example, if your target environment is JVM:
// kotlin("jvm") version "2.1.21"
}
plugins {
// Replace `<...>` with the plugin name appropriate for your target environment
id 'org.jetbrains.kotlin.<...>' version '2.1.21'
// For example, if your target environment is JVM:
// id 'org.jetbrains.kotlin.jvm' version '2.1.21'
}
NOTE
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.1.20 | 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 |
DANGER
*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()
関数を呼び出すMultiplatformプロジェクトで非推奨警告が表示される場合があります。
詳細については、デフォルトで作成されるJavaソースセットをご覧ください。
最新リリースまでのGradleおよびAGPバージョンも使用できますが、その場合、非推奨警告が表示されたり、一部の新機能が動作しなかったりする可能性があることに注意してください。
たとえば、Kotlin Gradleプラグインとkotlin-multiplatform
プラグイン 2.1.21 は、プロジェクトをコンパイルするために最低Gradleバージョン 7.6.3 を必要とします。
同様に、最大完全サポートバージョンは 8.12.1 です。これには非推奨のGradleメソッドやプロパティがなく、すべての現在のGradle機能をサポートしています。
プロジェクト内のKotlin Gradleプラグインデータ
デフォルトでは、Kotlin Gradleプラグインは、プロジェクト固有の永続データをプロジェクトのルートの.kotlin
ディレクトリに保存します。
DANGER
.kotlin
ディレクトリをバージョン管理にコミットしないでください。
たとえば、Gitを使用している場合は、.kotlin
をプロジェクトの.gitignore
ファイルに追加してください。
この動作を設定するために、プロジェクトの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.1.21"
}
plugins {
id "org.jetbrains.kotlin.jvm" version "2.1.21"
}
このブロックのversion
はリテラルである必要があり、別のビルドスクリプトから適用することはできません。
KotlinとJavaのソース
KotlinソースとJavaソースは同じディレクトリに保存することも、異なるディレクトリに配置することもできます。
デフォルトの慣習では、異なるディレクトリを使用します。
project
- src
- main (root)
- kotlin
- java
DANGER
.java
ファイルをsrc/*/kotlin
ディレクトリに保存しないでください。.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
NOTE
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
と等しくない場合。
ビルドスクリプトにjvmTarget
値に関する明示的な情報がなく、Kotlin JVMプラグインのみが存在するデフォルトのJVMターゲット構成を考えてみましょう。
plugins {
kotlin("jvm") version "2.1.21"
}
plugins {
id "org.jetbrains.kotlin.jvm" version "2.1.21"
}
ビルドスクリプトにjvmTarget
値に関する明示的な情報がない場合、そのデフォルト値はnull
であり、コンパイラはそれをデフォルト値1.8
に変換します。targetCompatibility
は、現在のGradleのJDKバージョン、つまりご自身のJDKバージョンと等しくなります(Javaツールチェーンアプローチを使用しない限り)。ご自身のJDKバージョンが17
であると仮定すると、発行されるライブラリ成果物はJDK 17+と互換性があることを宣言します (org.gradle.jvm.version=17
)。これは誤りです。この場合、バイトコードのバージョンが1.8
であっても、このライブラリを追加するにはメインプロジェクトでJava 17を使用する必要があります。この問題を解決するには、ツールチェーンを構成します。
Gradle Javaツールチェーンサポート
DANGER
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バージョンに置き換えてください。
android {
compileOptions {
sourceCompatibility = <MAJOR_JDK_VERSION>
targetCompatibility = <MAJOR_JDK_VERSION>
}
}
Gradle 6.7でJavaツールチェーンサポートが導入されました。 この機能を使用すると、次のことが可能です。
- Gradleとは異なるJDKとJREを使用して、コンパイル、テスト、実行可能ファイルを実行できます。
- まだリリースされていない言語バージョンでコードをコンパイルおよびテストできます。
ツールチェーンサポートにより、GradleはローカルJDKを自動検出でき、ビルドに必要な不足している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バージョンと一致していることを確認してください。
NOTE
Gradleがどのツールチェーンを使用しているかを確認するには、ログレベル--info
でGradleビルドを実行し、出力で[KOTLIN] Kotlin compilation 'jdkHome' argument:
から始まる文字列を探してください。
コロンの後の部分がツールチェーンのJDKバージョンになります。
特定のタスクに任意のJDK (ローカルJDKでも) を設定するには、Task DSLを使用します。
KotlinプラグインにおけるGradle JVMツールチェーンサポートについて詳しく学ぶ。
Task DSLでJDKバージョンを設定する
Task DSLを使用すると、UsesKotlinJavaToolchain
インターフェースを実装するすべてのタスク(現時点ではKotlinCompile
とKaptTask
)に対して任意のJDKバージョンを設定できます。 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
コンパイルなど、一部のコンパイルを関連付けます。 カスタムコンパイルのいずれかが別のコンパイルと関連していることを表現する必要がある場合は、独自の関連コンパイルを作成します。
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モジュール (JPMS) が有効な場合の構成
Kotlin GradleプラグインをJavaモジュールで動作させるには、ビルドスクリプトに以下の行を追加し、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}"]
}
})
}
NOTE
module-info.java
は通常通りsrc/main/java
ディレクトリに配置してください。
モジュールの場合、Kotlinファイルのパッケージ名はmodule-info.java
のパッケージ名と一致している必要があります。「package is empty or does not exist」というビルドエラーを回避するためです。
詳細については、以下をご覧ください。
その他の詳細
詳細については、以下をご覧ください。
- コンパイラのオプションとそれらを渡す方法。
- インクリメンタルコンパイル、キャッシュサポート、ビルドレポート、Kotlinデーモン。
- Gradleの基本と詳細。
- Gradleプラグインのバリアントのサポート。
コンパイルタスクでの成果物の使用を無効にする
まれなシナリオでは、循環依存関係エラーが原因でビルドが失敗することがあります。たとえば、複数のコンパイルがあり、1つのコンパイルが別のコンパイルのすべての内部宣言を参照でき、生成された成果物が両方のコンパイルタスクの出力に依存している場合です。
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
Lazy Kotlin/JVMタスクの作成
Kotlin 1.8.20以降、Kotlin Gradleプラグインはすべてのタスクを登録し、ドライランではそれらを構成しません。
コンパイルタスクのdestinationDirectory
の非デフォルトの場所
Kotlin/JVM KotlinJvmCompile
/KotlinCompile
タスクのdestinationDirectory
の場所をオーバーライドする場合は、ビルドスクリプトを更新してください。JARファイルでsourceSets.main.kotlin.classesDirectories
をsourceSets.main.outputs
に明示的に追加する必要があります。
tasks.jar(type: Jar) {
from sourceSets.main.outputs
from sourceSets.main.kotlin.classesDirectories
}
複数のプラットフォームをターゲットにする
マルチプラットフォームプロジェクトと呼ばれる、複数のプラットフォームをターゲットにするプロジェクトでは、kotlin-multiplatform
プラグインが必要です。
NOTE
kotlin-multiplatform
プラグインはGradle 7.6.3以降で動作します。
plugins {
kotlin("multiplatform") version "2.1.21"
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '2.1.21'
}
異なるプラットフォーム向けKotlin MultiplatformおよびiOSとAndroid向けKotlin Multiplatformについて詳しく学ぶ。
Androidをターゲットにする
Androidアプリケーションの作成にはAndroid Studioを使用することをお勧めします。Android Gradleプラグインの使用方法を学びましょう。
JavaScriptをターゲットにする
JavaScriptをターゲットにする場合も、kotlin-multiplatform
プラグインを使用します。Kotlin/JSプロジェクトのセットアップ方法について詳しく学ぶ。
plugins {
kotlin("multiplatform") version "2.1.21"
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '2.1.21'
}
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、Multiplatform、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
依存関係を自動的にアライメントします。
Kotlin標準ライブラリのバージョン1.8.0から1.9.10までの依存関係を追加した場合(例: 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
に対するプラットフォーム依存関係を宣言してください。
implementation(platform("org.jetbrains.kotlin:kotlin-bom:2.1.21"))
implementation platform('org.jetbrains.kotlin:kotlin-bom:2.1.21')
:::
標準ライブラリのバージョンに依存関係を追加していないが、推移的に異なる古いバージョンのKotlin標準ライブラリをもたらす2つの異なる依存関係がある場合、これらの推移的なライブラリに対して明示的に
2.1.21
バージョンを要求できます。
dependencies {
constraints {
add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk7") {
version {
require("2.1.21")
}
}
add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk8") {
version {
require("2.1.21")
}
}
}
}
dependencies {
constraints {
add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk7") {
version {
require("2.1.21")
}
}
add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk8") {
version {
require("2.1.21")
}
}
}
}
:::
Kotlin標準ライブラリバージョン
2.1.21
への依存関係を追加し(implementation("org.jetbrains.kotlin:kotlin-stdlib:2.1.21")
など)、古いバージョン(1.8.0
より前)のKotlin Gradleプラグインを使用している場合、Kotlin Gradleプラグインを標準ライブラリのバージョンに合わせて更新してください。
plugins {
// replace `<...>` with the plugin name
kotlin("<...>") version "2.1.21"
}
plugins {
// replace `<...>` with the plugin name
id "org.jetbrains.kotlin.<...>" version "2.1.21"
}
:::
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.1.21
に置き換えるか、kotlin-stdlib:1.8+
をもたらすライブラリからその推移的依存関係を除外してください。
dependencies {
implementation("com.example:lib:1.0") {
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib")
}
}
dependencies {
implementation("com.example:lib:1.0") {
exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib"
}
}
:::
テストライブラリの依存関係を設定する
kotlin.test
APIは、サポートされているすべてのプラットフォームでKotlinプロジェクトをテストするために利用できます。 kotlin-test
依存関係をcommonTest
ソースセットに追加すると、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
}
}
}
}
NOTE
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 Multiplatformプロジェクトのものです。
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>
のパターンを使用して、依存関係をトップレベルで指定することもできます。これは、gradleApi()
、localGroovy()
、gradleTestKit()
など、ソースセットの依存関係DSLでは利用できない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リポジトリです。
DANGER
Mavenプロジェクトも扱っている場合は、mavenLocal()
をリポジトリとして追加しないことをお勧めします。GradleとMavenプロジェクトを切り替える際に問題が発生する可能性があるためです。もしmavenLocal()
リポジトリをどうしても追加する必要がある場合は、repositories{}
ブロックの最後に配置してください。詳細については、The case for mavenLocal()をご覧ください。
複数のサブプロジェクトで同じリポジトリを宣言する必要がある場合は、settings.gradle(.kts)
ファイルのdependencyResolutionManagement{}
ブロックでリポジトリを一元的に宣言します。
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}
サブプロジェクトで宣言されたリポジトリは、一元的に宣言されたリポジトリを上書きします。この動作を制御する方法や利用可能なオプションの詳細については、Gradleのドキュメントを参照してください。
次のステップ
詳細については、以下をご覧ください。