我是一個初學者,gradle想在我的 Kotlin 專案中使用koin 。
但是,我收到以下錯誤
Execution failed for task ':compileTestKotlin'.
> Error while evaluating property 'filteredArgumentsMap' of task ':compileTestKotlin'
> Could not resolve all files for configuration ':testCompileClasspath'.
> Could not resolve org.jetbrains.kotlin:kotlin-test-junit5:1.6.20.
Required by:
project : > org.jetbrains.kotlin:kotlin-test:1.6.20
> Module 'org.jetbrains.kotlin:kotlin-test-junit5' has been rejected:
Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.20' also provided by [org.jetbrains.kotlin:kotlin-test-junit:1.6.10(junitApi)]
> Could not resolve org.jetbrains.kotlin:kotlin-test-junit:1.6.10.
Required by:
project : > io.insert-koin:koin-test:3.2.0-beta-1 > io.insert-koin:koin-test-jvm:3.2.0-beta-1
> Module 'org.jetbrains.kotlin:kotlin-test-junit' has been rejected:
Cannot select module with conflict on capability 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.10' also provided by [org.jetbrains.kotlin:kotlin-test-junit5:1.6.20(junit5Api)]```
這是我的gradle.build.kts檔案
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val koinVersion = "3.2.0-beta-1"
plugins {
kotlin("jvm") version "1.6.20"
kotlin("plugin.serialization") version "1.6.10"
application
}
group = "org.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
implementation("io.insert-koin:koin-core:$koinVersion")
testImplementation("io.insert-koin:koin-test:$koinVersion")
testImplementation("io.insert-koin:koin-test-junit5:$koinVersion")
testImplementation("com.willowtreeapps.assertk:assertk-jvm:0.25")
testImplementation(kotlin("test"))
}
tasks.test {
useJUnitPlatform()
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}
application {
mainClass.set("MainKt")
}
uj5u.com熱心網友回復:
看起來有3個問題
正如我在評論中提到的,Kotlin JVM 和序列化插件的版本不匹配。這些應該總是一樣的!
plugins {
kotlin("jvm") version "1.6.21"
kotlin("plugin.serialization") version "1.6.21"
application
}
但是,正如您所發現的,它仍然不起作用。有一個更大的錯誤訊息,包含三個錯誤。
Could not resolve io.insert-koin:koin-test-junit5:3.2.0-beta-1Could not resolve org.jetbrains.kotlin:kotlin-test-junit5:1.6.21Could not resolve org.jetbrains.kotlin:kotlin-test-junit:1.6.10
讓我們一個一個地瀏覽它們
Java 11 庫,Java 8 專案
以下是 Gradle 給出的第一次失敗的原因:
無法決議 io.insert-koin:koin-test-junit5:3.2.0-beta-1。
沒有找到 io.insert-koin:koin-test-junit5:3.2.0-beta-1 的匹配變體。消費者被配置為查找與 Java 8 兼容的庫的 API,最好以類檔案的形式,最好針對標準 JVM 進行優化,并在外部宣告其依賴項,以及屬性 'org.jetbrains.kotlin.platform.type ' 值為 'jvm' 但
- 不兼容,因為該組件宣告了一個與Java 11兼容的組件,而消費者需要一個與Java 8兼容的組件
組件 ,koin-test-junit5僅與 Java 11 兼容,但您的專案需要 Java 8 ( kotlinOptions.jvmTarget = "1.8")。
讓我們先解決這個問題,使用 Gradle Toolchain
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions.jvmTarget = "11"
}
kotlin {
jvmToolchain {
(this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(11))
}
}
這解決了 Java 版本不匹配的問題,并留下了另外兩個錯誤。
能力沖突 - 庫不兼容
無法選擇功能沖突的模塊
無法選擇與功能 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.10' 沖突的模塊,也由 [org.jetbrains.kotlin:kotlin-test-junit:1.6.10(junitApi)] 提供
無法選擇與功能 'org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.10' 沖突的模塊也由 [org.jetbrains.kotlin:kotlin-test-junit5:1.6.10(junit5Api)] 提供
理解這一點需要對 Gradle 如何選擇版本有相當多的了解。
tl; dr:org.jetbrains.kotlin:kotlin-test-junit并且org.jetbrains.kotlin:kotlin-test-junit5不兼容。您只能使用其中一個 - 不能同時使用
我真的不明白 Koin 需要什么才能最好地作業。看起來它對 JUnit5 有一個硬依賴,所以你必須使用這些依賴,并且不能使用kotlin("test")
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
implementation("io.insert-koin:koin-core:$koinVersion")
testImplementation("io.insert-koin:koin-test:$koinVersion")
testImplementation("io.insert-koin:koin-test-junit5:$koinVersion")
testImplementation("com.willowtreeapps.assertk:assertk:0.25")
testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")
// incompatible with JUnit 5, which I think is required by Koin?
// testImplementation(kotlin("test"))
}
解釋
簡而言之,當你使用 Gradle 構建庫時,你可以宣告'attributes'。它們是自由格式的字串,所以它們實際上可以是任何東西。他們描述了諸如“這個庫需要 Java 11”或“這是測驗覆寫率資料”之類的東西。
一些屬性對于 Gradle 解決專案的依賴關系很重要。您最初遇到的錯誤是由一個這樣的屬性引起的:'capability'。它描述了庫生成的 Maven 坐標。
在 Maven 坐標的情況下,如果它們發生沖突,則 Gradle 不知道該怎么做,并引發錯誤。由用戶來修復它。有很多關于沖突解決的 Gradle 檔案,但通常最簡單的答案是洗掉任何沖突的依賴項。
功能的有趣之處在于,因為它只是一個字串,所以您可以向其中添加任何內容。并且作者所做的org.jetbrains.kotlin:kotlin-test-junit5和org.jetbrains.kotlin:kotlin-test-junit所做的都賦予了他們相同的能力。
org.jetbrains.kotlin:kotlin-test-framework-impl:1.6.10
如果你搜索這個庫,你會發現它不存在。那是因為能力完全是人為的!作者已經編造出來了,特別是 Gradle 會拋出一個錯誤,由用戶來修復它。
所以這就是解決方法:選擇一個kotlin-test-junit或kotlin-test-junit5,因為你不能同時擁有。
uj5u.com熱心網友回復:
我認為org.jetbrains.kotlin:kotlin-test-junit5依賴關系有問題。
我也遇到了同樣的問題,所以我嘗試了多種解決方案,但都失敗了。
而且我意識到,當只是添加依賴項時kotlin-test-junit5,kotlin-test-junit也會添加到外部庫中。
所以這是我的作業解決方案。
我首先將此行添加到 gradle 以啟用 useJunitPlatform()
tasks.withType<Test> {
useJUnitPlatform()
}
之后,我將 kotlin-test-junit 從每個這樣的參考中排除,
testImplementation("io.ktor:ktor-server-tests-jvm:$ktorVersion")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVersion") {
exclude(group = "org.jetbrains.kotlin", module = "kotlin-test-junit")
}
// Dependency Injection
val koinVersion: String by project
implementation("io.insert-koin", "koin-ktor", koinVersion)
implementation("io.insert-koin", "koin-logger-slf4j", koinVersion)
testImplementation("io.insert-koin", "koin-test-junit5", koinVersion) {
exclude(group = "org.jetbrains.kotlin", module = "kotlin-test-junit")
}
之后,junit5 測驗運行良好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/475163.html
標籤:科特林 毕业典礼 junit5 gradle-kotlin-dsl koin
