首页 > 解决方案 > 在 Kotlin 多平台多模块项目中使用 Gradle 6.5 链接依赖项

问题描述

我有以下结构,我想将integration-jvm-1其作为依赖项包含在里面module-mp-1和里面application-jvm-1,我想将module-mp-1JVM 输出包含为依赖项。

查看 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

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

标签: kotlingradlegradle-kotlin-dslkotlin-multiplatform

解决方案


使用 Gradle 构建多平台项目是该主题的最佳资源。特别是在添加依赖项中它说:

对另一个多平台项目的project('...')依赖会自动解析为适当的目标。在源集的依赖项中指定单个project('...')依赖项就足够了,并且包含源集的编译将收到该项目的相应平台特定工件,前提是它具有兼容的目标。

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


推荐阅读