Я пытаюсь создать kotlin-common библиотеку, которая содержит общую бизнес-логику, которая будет использоваться на нескольких платформах. Библиотека сам имеет зависимости нет от всего, что предоставляют платформы. Это чистый котлин (в основном классы данных и помощники преобразования).
Я использую Kotlin 1.2.51 и Intellij IDEA 2018.2. Я установил дополнительный плагин intellij для kotlinx.
Общая библиотека также зависит от https://github.com/Kotlin/kotlinx.serialization, но не имеет других зависимостей.
Я потратил несколько часов, пытаясь обернуть голову и исправить свои скрипты Gradle, но безуспешно. Я хочу иметь возможность писать модульные тесты в модуле common. Специфичные для платформы модули не должны нуждаться в каких-либо дополнительных тестах, поскольку нет специфической для платформы логики.
В общем модуле есть автозавершение всего кода, и сценарий сборки работает нормально. Я могу писать тесты. Когда я пытаюсь запустить один из этих тестов в среде IDE, он запускает его через jvm (имеет смысл)
Этот тест jvm не может быть скомпилирован с помощью:
java.lang.NoClassDefFoundError: kotlinx/serialization/json/JsonTreeParser
JsonTreeParser является частью модуля kotlinx-сериализации. IDE показывает это нормально. Общий модуль импортирует это нормально.
Вот мои скрипты Gradle:
общий модуль
buildscript {
ext.kotlin_version = '1.2.51'
ext.serialization_version = '0.6.0'
repositories {
jcenter()
maven { url "https://kotlin.bintray.com/kotlinx" }
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlinx:kotlinx-gradle-serialization-plugin:$serialization_version"
}
}
plugins {
id 'kotlin-platform-common' version '1.2.51'
}
apply plugin: 'kotlinx-serialization'
repositories {
jcenter()
maven { url "https://kotlin.bintray.com/kotlinx" }
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-common"
testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common"
testCompile "org.jetbrains.kotlin:kotlin-test-common"
compile "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version"
}
модуль jvm
buildscript {
ext.kotlin_version = '1.2.51'
ext.serialization_version = '0.6.0'
repositories {
jcenter()
maven { url "https://kotlin.bintray.com/kotlinx" }
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlinx:kotlinx-gradle-serialization-plugin:$serialization_version"
}
}
plugins {
id 'kotlin-platform-jvm' version '1.2.51'
}
apply plugin: 'kotlinx-serialization'
repositories {
jcenter()
maven { url "https://kotlin.bintray.com/kotlinx" }
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
expectedBy project(":jpatch-kotlin-common")
testCompile "junit:junit:4.12"
testCompile "org.jetbrains.kotlin:kotlin-test"
testCompile "org.jetbrains.kotlin:kotlin-test-junit"
compile "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serialization_version"
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
sourceCompatibility = "1.8"
И мой контрольная работа в общем модуле
@Test
fun it_does_stuff() {
assertEquals(true, true)
val patch = JsonPatch()
assertEquals(3, patch.cool())
val input = """{"a": "foo", "b": 10, "c": true, "d": null}"""
val elem: JsonElement = JsonTreeParser(input).read() // or .readFully() to throw exception if input was not consumed fully
elem as JsonObject
elem.keys == setOf("a", "b", "c", "d") // true
assertEquals(JsonLiteral("foo"), elem["a"])
}
Прямо из документации.
Какую глупую мелочь я делаю неправильно?
Спасибо!
По какой-то причине ваш путь к классам тестов пропускает этот класс, хотя он у вас есть в пути к классам компиляции. Мне не удалось воспроизвести вашу проблему в этом примере проекта: github.com/sandwwraith/KotlinSerializationPlayground. Вы можете попробовать сравнить свою настройку и мою.
Спасибо @sandwwraith, используя этот пример, я смог решить свою проблему.
Вы должны написать решение как ответ и отметить вопрос как принятый.


Попробуйте перейти на Kotlin 1.2.60. В мультиплатформенные проекты Kotlin внесены некоторые изменения, которые могут решить проблему.