首页 > 解决方案 > 使用 Gradle 在 IntelliJ 中具有多个源集的 2 个项目的未解决依赖关系

问题描述

我正在尝试在 Gradle 中为 JS 和 JVM 使用一个通用的 Kotlin 源集和 2 个特定的源集。我知道有一个kotlin-multiplatform插件,但我想尝试是否可以进行这样的设置。它通过gradle从命令行运行来工作,但 IntelliJ 抱怨在 JS 或 JVM 项目中(从不同时)它无法找到公共类。

我的目录结构如下:

- common
    - src/main/kotlin/MyLibrary.kt
- js
    - build.gradle.kts
    - src/main/kotlin/JsDemo.kt
- jvm
    - build.gradle.kts
    - src/main/kotlin/JvmDemo.kt

这里,Jsdemo 和 JvmDemo 无非是:

fun main() {
    MyLibrary().sayHello()
}

构建脚本是这样的

JS

plugins {
    id("kotlin2js") version "1.3.41"
}

repositories {
    jcenter()
}

dependencies {
   implementation(kotlin("stdlib-js"))
}

sourceSets["main"].withConvention(KotlinSourceSet::class) {
    kotlin.srcDir("../common/src/main/kotlin")
}

虚拟机

plugins {
    kotlin("jvm") version "1.3.41"
}

repositories {
    jcenter()
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
}

sourceSets {
    main {
        withConvention(KotlinSourceSet::class) {
            kotlin.srcDir("../common/src/main/kotlin")
        }
    }
}

从命令行运行任务时,一切正常。但是,在 IntelliJ 中,无法为其中 1 个项目解析 MyLibrary()。它是哪个项目取决于我先打开哪个项目。如果我首先打开 JsDemo,则 JvmDemo 会出现问题,反之亦然。

知道是什么导致了这个问题吗?

标签: javascriptintellij-ideakotlinjvm

解决方案


IntelliJ IDEA 在很大程度上依赖于一个事实,即单个源文件只能分析一次,作为单个模块的一部分和单个上下文(平台、依赖项、语言设置等)。如果该假设不成立,它仍然会分析一次源文件,并且不会对包含该文件的其他模块执行此操作。这会导致你得到的行为。不支持在多个 IDE 模块中包含单个源文件。

Kotlin 多平台项目通过实际分析一次源代码来解决这个问题,但使用适当的上下文告诉 IDE 平台和预期-实际匹配。这是在平台之间共享代码的推荐方式。


推荐阅读