Скрипты gradle для общих модулей Kotlin без реального кода, специфичного для платформы

Я пытаюсь создать 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"])
}

Прямо из документации.

Какую глупую мелочь я делаю неправильно?

Спасибо!

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

Alexander Egger 03.08.2018 22:04

По какой-то причине ваш путь к классам тестов пропускает этот класс, хотя он у вас есть в пути к классам компиляции. Мне не удалось воспроизвести вашу проблему в этом примере проекта: github.com/sandwwraith/KotlinSerializationPlayground. Вы можете попробовать сравнить свою настройку и мою.

sandwwraith 06.08.2018 13:09

Спасибо @sandwwraith, используя этот пример, я смог решить свою проблему.

Michael 06.08.2018 23:16

Вы должны написать решение как ответ и отметить вопрос как принятый.

Jhon Pedroza 01.10.2018 08:02
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
1
4
444
0

Другие вопросы по теме