Компилятор не может разрешить классы в io.ktor.client.features.logging

Я пытаюсь добавить ведение журнала для Ktor http-запросов в приложении для Android. В соответствии с документы я должен добавить зависимость gradle

implementation "io.ktor:ktor-client-logging:$ktor_version"

и просто используйте этот фрагмент

val client = HttpClient() {
    install(Logging) {
        logger = Logger.DEFAULT
        level = LogLevel.HEADERS
    }
}

Проблема в том, что компилятор «игнорирует» пакет «io.ktor.client.features.logging», добавленный как зависимость. Странно то, что JsonFeature (добавленный как аналогичная зависимость) работает нормально.

install(JsonFeature) { // perfectly works
...
}

install(Logging) { // unresolved reference
...
}

Я уже проверил .jar файл, который Gradle добавил в проект, он содержит все ожидаемые классы, я могу открыть их и увидеть исходный код, но волшебным образом просто не могу использовать в своем приложении. После нескольких часов исследований я предполагаю, что это может быть как-то связано с метаданными Gradle или с тем, что функция ведения журнала является многоплатформенной, и требуется некоторая дополнительная конфигурация Gradle, но, к сожалению, я не эксперт Gradle.

Пробовал добавлять enableFeaturePreview("GRADLE_METADATA") к settings.gradle, но безрезультатно. Даже пытался добавить "-jvm" в зависимость.

implementation "io.ktor:ktor-client-logging-jvm:$ktor_version"

С этой зависимостью Android Studio успешно находит пакет, но не компилируется со следующей ошибкой

More than one file was found with OS independent path 'META-INF/ktor-http.kotlin_module'

Кто-нибудь может пояснить, как правильно настроить зависимость для регистратора Ktor?

3
0
2 071
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для ktor-client-logging у вас должна быть установлена ​​​​зависимость для каждой платформы:

commonMain {
    dependencies {
        implementation "ch.qos.logback:logback-classic:1.2.3"
        implementation "io.ktor:ktor-client-logging:$ktor_version"
    }
}

androidMain {
    dependencies {
        implementation "io.ktor:ktor-client-logging-jvm:$ktor_version"
    }
}

iosMain {
    dependencies {
        implementation "io.ktor:ktor-client-logging-native:$ktor_version"
    }
}

что касается мета META-INF/ktor-http.kotlin_module, добавьте к app/build.gradle внутри блока android {}:

android {
    packagingOptions {
        exclude 'META-INF/common.kotlin_module'
        exclude 'META-INF/*.kotlin_module'
    }
}

Я сделал настройку правильно, но я не вижу никаких журналов. Можете ли вы провести меня здесь?

Archie G. Quiñones 06.12.2019 09:57

@ ArchieG.Quiñones, вы случайно не инициализируете HttpClient с помощью HttpClient { install(Logging) { logger = Logger.DEFAULT } } и, возможно, level = LogLevel.ALL без дополнительной информации? Боюсь, я не смогу помочь.

Rodrigo Queiroz 06.12.2019 20:16

Да, я сделал. Я пытаюсь увидеть журналы в Android, но не могу их увидеть. У вас есть работающий проект, на который я смотрю?

Archie G. Quiñones 07.12.2019 03:31
io.ktor:ktor-client-logging-jvm предполагает, что у вас есть SL4J в качестве зависимости. Добавьте его как зависимость, и вы увидите журналы.
Emmanuel 15.04.2020 19:32

Спасибо за добавление к ответу @Emmanuel, я думал, что клиент уже включил SL4J -> github.com/ktorio/ktor/blob/master/ktor-client/…

Rodrigo Queiroz 15.04.2020 20:12

Я тоже так думал, но, как мы видим, это зависимость только для компиляции.

Emmanuel 15.04.2020 23:42

Хороший улов в том, что @Emmanuel согласно документации Вход в Кторlogback, который является преемником log4j, упоминается и включается в commonMain и, таким образом, должен охватывать случай отсутствующей зависимости для SL4J.

Rodrigo Queiroz 16.04.2020 00:14

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