在 Kotlin 多平台多模块项目中将依赖项与 Gradle 6.5 链接

Linking dependencies with Gradle 6.5 in a Kotlin Multiplatform Multimodule project

我有以下结构,我想将 integration-jvm-1 作为依赖包含在 module-mp-1application-jvm-1 中,我想包含 module-mp-1 的 JVM 输出作为依赖。

查看 Github 上的示例项目: https://github.com/JVAAS/kotlin-multiplatform-multi-module-setup

以下是我目前所做工作的概述:

generic-project
  +-- applications
      +-- application-jvm-1
  +-- integrations
      +-- integration-jvm-1
  +-- modules
      +-- module-mp-1
  build.gradle.kts
  settings.gradle.kts

我的build.gradle.kts是空的,settings.gradle.kts如下:

rootProject.name = "generic-project"

include("applications:application-jvm-1")
include("modules:module-mp-1")
include("integrations:integration-jvm-1")

pluginManagement {
    repositories {
        mavenCentral()
        gradlePluginPortal()
        maven {
            url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
        }
    }
}

applications/application-jvm-1/build.gradle.kts如下 (注意 api(project(":modules:module-mp-1")) 依赖项)

plugins {
    val kotlinVersion = "1.4-M2"
    application
    kotlin("multiplatform") version kotlinVersion
    kotlin("plugin.serialization") version kotlinVersion
}

group = "com.generic.applications"
version = "1.0.0"

repositories {
    jcenter()
    mavenCentral()
    maven {
        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
    }
    maven {
        url = uri("https://kotlin.bintray.com/kotlinx")
    }
    gradlePluginPortal()
}

kotlin {
    jvm {
        compilations.all {
            kotlinOptions.jvmTarget = "11"
        }
    }

    sourceSets {

        val serializationVersion = "0.20.0-1.4-M2"
        val coroutinesVersion = "1.3.7-1.4-M2"

        val jvmMain by getting {
            dependencies {
                implementation(kotlin("stdlib-jdk8"))
                implementation(kotlin("reflect"))

                api(project(":modules:module-mp-1"))

            }
        }
        val jvmTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
            }
        }
        all {
            languageSettings.enableLanguageFeature("InlineClasses")
        }
    }

}

application {
    mainClassName = "Application"
}

integrations/integration-jvm-1/build.gradle.kts如下:

plugins {
    val kotlinVersion = "1.4-M2"
    kotlin("multiplatform") version kotlinVersion
    kotlin("plugin.serialization") version kotlinVersion
}

group = "com.generic.integrations"
version = "1.0.0"

repositories {
    jcenter()
    mavenCentral()
    maven {
        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
    }
    maven {
        url = uri("https://kotlin.bintray.com/kotlinx")
    }
    gradlePluginPortal()
}

kotlin {
    jvm {
        compilations.all {
            kotlinOptions.jvmTarget = "11"
        }
    }

    sourceSets {

        val serializationVersion = "0.20.0-1.4-M2"
        val coroutinesVersion = "1.3.7-1.4-M2"

        val jvmMain by getting {
            dependencies {
                implementation(kotlin("stdlib-jdk8"))
                implementation(kotlin("reflect"))

                // logging
                val slf4jVersion = "1.7.25"
                val logbackVersion = "1.2.3"
                implementation("org.slf4j:slf4j-api:$slf4jVersion")
                implementation("org.slf4j:jcl-over-slf4j:$slf4jVersion")
                implementation("org.slf4j:jul-to-slf4j:$slf4jVersion")
                implementation("org.slf4j:log4j-over-slf4j:$slf4jVersion")
                implementation("ch.qos.logback:logback-classic:$logbackVersion")

            }
        }
        val jvmTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
            }
        }
        all {
            languageSettings.enableLanguageFeature("InlineClasses")
        }
    }

}

/modules/module-mp-1/build.gradle.kts如下: (注意依赖关系api(project(":integrations:integration-jvm-1"))

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.4-M2"
}
group = "com.generic.modules"
version = "1.0.0"

repositories {
    mavenCentral()
    jcenter()
    maven {
        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
    }
}
dependencies {
    testImplementation(kotlin("test-junit5"))
    implementation(kotlin("stdlib-jdk8"))

    // ktor
    val ktorVersion = "1.3.1"
    //implementation("io.ktor:ktor-server-netty:$ktorVersion")
    implementation("io.ktor:ktor-server-cio:$ktorVersion")
    implementation("io.ktor:ktor-html-builder:$ktorVersion")
    implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:0.7.1")

    // logging
    val slf4jVersion = "1.7.25"
    val logbackVersion = "1.2.3"
    implementation("org.slf4j:slf4j-api:$slf4jVersion")
    implementation("org.slf4j:jcl-over-slf4j:$slf4jVersion")
    implementation("org.slf4j:jul-to-slf4j:$slf4jVersion")
    implementation("org.slf4j:log4j-over-slf4j:$slf4jVersion")
    implementation("ch.qos.logback:logback-classic:$logbackVersion")

    api(project(":integrations:integration-jvm-1"))

}
tasks.withType<KotlinCompile>() {
    kotlinOptions.jvmTarget = "11"
}

当我将通用项目拉入 IntelliJ 并进行 gradle 刷新时,我没有收到错误,但是当我在应用程序中使用模块依赖项时我也无法编译它

import com.generic.modules.Module1 <<-- unresolved reference modules

object Application {

    @JvmStatic
    fun main(args: Array<String>) {

        println("TEST")

        println(Module1().toString())

    }


}

有什么想法吗? 我已经在 Github 上制作了一个包含上述所有内容的示例项目 https://github.com/JVAAS/kotlin-multiplatform-multi-module-setup

如果这个目录结构让它变得比它应该的更难,那么我也很乐意改变它。只希望依赖项以一种或另一种方式工作。

Building Multiplatform Projects with Gradle is the best resource on this topic. Specifically in Adding Dependencies 它说:

a project('...') dependency on another multiplatform project is resolved to an appropriate target automatically. It is enough to specify a single project('...') dependency in a source set's dependencies, and the compilations that include the source set will receive a corresponding platform-specific artifact of that project, given that it has a compatible target.

本文还包含有关如何配置项目依赖项的示例。