kotlin - 在 Kotlin 多平台多模块项目中使用 Gradle 6.5 链接依赖项
问题描述
我有以下结构,我想将integration-jvm-1
其作为依赖项包含在里面module-mp-1
和里面application-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
如果这个目录结构使它变得比它应该的更困难,那么我也很乐意改变它。只希望依赖项以一种或另一种方式工作。
解决方案
使用 Gradle 构建多平台项目是该主题的最佳资源。特别是在添加依赖项中它说:
对另一个多平台项目的
project('...')
依赖会自动解析为适当的目标。在源集的依赖项中指定单个project('...')
依赖项就足够了,并且包含源集的编译将收到该项目的相应平台特定工件,前提是它具有兼容的目标。
本文还包含有关如何配置项目依赖项的示例。
推荐阅读
- c# - 错误不支持文件的磁盘结构...找到 11.1,支持 12.0
- tensorflow - 运行 tensorflow 的 object_detection_model (下载模型出错)
- python - 迭代python中的不同函数
- vb.net - 如何在 Visual Basic 中将字符串转换为十进制?
- animation - 在 Xamarin.Forms.Core.Animation 上使用 TranslateTo 来制作动画?
- vim - 为什么这个 vim 函数不能工作,而是作为 cmd 运行
- python - 如何迭代 4 x 4 NumPy 矩阵类?
- python - 熊猫合并问题
- angular - 设置 mat-datepicker 的范围
- python - 使用 python docx 突出显示 word doc 中的所有日期值