Переопределение зависимостей в проекте Kotlin Multiplatform

Вопрос или проблема

У меня есть мультиплатформенный проект на Kotlin с целевым значением jvm. В нем две зависимости LWJGL – исходники и родные библиотеки.

Когда я указываю их вместе, я получаю только зависимость от исходников. Когда я указываю только родные библиотеки, я получаю только родные библиотеки. Похоже, они конфликтуют друг с другом…

Однако в обычном Java проекте они загружаются без проблем.

Кто-нибудь сталкивался с этой проблемой?

plugins {
    id("org.jetbrains.kotlin.multiplatform") version "2.1.0-Beta1"
}

kotlin {
  sourceSets {
    jvmMain {
      dependencies {
        api("org.lwjgl:lwjgl:3.3.4")
        api("org.lwjgl:lwjgl:3.3.4:natives-windows")
      }
    }
  }
}

Исходники + родные библиотеки

введите описание изображения здесь

Только родные библиотеки

введите описание изображения здесь

Обычный Java проект

введите описание изображения здесь

Ответ или решение

В Kotlin Multiplatform проекте ситуация с зависимостями, особенно когда речь идет о библиотеках, таких как LWJGL, может быть довольно сложной. Давайте разберемся с вашей проблемой.

Проблема конфликта зависимостей

Когда вы указываете зависимости как api("org.lwjgl:lwjgl:3.3.4") и api("org.lwjgl:lwjgl:3.3.4:natives-windows"), у вас возникает конфликт, который может быть вызван тем, что Kotlin Multiplatform не может корректно разрешить эти две зависимости, когда они указаны вместе. В отличие от обычных Java-проектов, где такие зависимости могут загружаться без проблем, мультиплатформенные проекты требуют более тщательной работы с конфигурациями.

Решение проблемы

  1. Попробуйте использовать implementation вместо api:
    В зависимости от ваших нужд, попробуйте заменить api на implementation для одной из зависимостей. Это может помочь избежать конфликта:

    kotlin {
       sourceSets {
           jvmMain {
               dependencies {
                   implementation("org.lwjgl:lwjgl:3.3.4")
                   implementation("org.lwjgl:lwjgl:3.3.4:natives-windows")
               }
           }
       }
    }
  2. Проверьте версии зависимостей:
    Убедитесь, что обе зависимости соотносятся к одной и той же версии LWJGL, чтобы избежать конфликта версий.

  3. Убедитесь, что зависимости работают в нужных контекстах:
    Убедитесь, что natives загружаются только для целевой платформы. Например, укажите нативные зависимости только для jvm (или для конкретной платформы), и попробуйте использовать следующую конструкцию:

    kotlin {
       jvm {
           compilations["main"].compileKotlinTask {
               kotlinOptions.jvmTarget = "1.8"
           }
           withJava()
       }
       sourceSets {
           jvmMain {
               dependencies {
                   implementation("org.lwjgl:lwjgl:3.3.4")
                   runtimeOnly("org.lwjgl:lwjgl:3.3.4:natives-windows")
               }
           }
       }
    }

    В этом примере runtimeOnly используется для указания нативных зависимостей, чтобы они загружались только во время исполнения, что может помочь избежать конфликта.

  4. Используйте dependencyResolutionManagement:
    Если вы используете Gradle, можно попробовать добавить управление разрешением зависимостей в файл settings.gradle.kts, если у вас несколько проектных модулей. Это может помочь гарантировать, что зависимости будут корректно разрешены на этапе компиляции.

  5. Изучите альтернативные варианты:
    Если ничего не помогает, возможно, стоит рассмотреть вариант использования других библиотек или версий LWJGL, которые могут быть более совместимыми с Kotlin Multiplatform.

Заключение

Работа с зависимостями в Kotlin Multiplatform требует определенного подхода. Следовательно, возможное решение может заключаться в изменении способа, которым вы добавляете зависимости, или в обновлении версий. Если ни одно из предложенных решений не сработает, рекомендуется обратиться к официальной документации Kotlin Multiplatform или сообществу разработчиков для получения дополнительной информации и помощи.

Оцените материал
Добавить комментарий

Капча загружается...