【问题标题】:Gradle 6.4, Kotlin and JPMSGradle 6.4、Kotlin 和 JPMS
【发布时间】:2020-05-06 14:51:23
【问题描述】:

所以,6.4 (终于)出来了,有JPMS support

迫不及待地想尝试一下,我开始修改我们的一个项目以便使用它。

jjohannes 在他的 repo 之一上有一个 (kotlin) 示例

我尝试将重要的内容复制/粘贴到我们的项目中 here

可惜我没有成功。

每当我尝试跑步时,我总会得到:

C:\Users\elect\IdeaProjects\kotlin-unsigned\src\main\java\module-info.java:4: 错误:找不到模块:kotlin.stdlib.jdk8 需要 kotlin.stdlib.jdk8;

参考module-info.java

module com.github.kotlin_graphics.kotlin_unsigned {

//    requires kotlin.stdlib;
    requires kotlin.stdlib.jdk8; // error

    exports unsigned;
}

stdlibstdlib-jdk8 变化不大

我做错了什么?

【问题讨论】:

    标签: kotlin gradle java-platform-module-system


    【解决方案1】:

    我检查了你的回购。

    您将需要这些修复。

    • 添加了java插件。
    plugins {
        kotlin("jvm") version "1.3.72"
        java
    }
    
    java {
        modularity.inferModulePath.set(true)
    }
    
    • 在所有 3 个地方使用 kotlin("stdlib")(2 个在 build.gradle.kts 和 1 个在 module-info.java)。
    dependencies {
        implementation(kotlin("stdlib"))
        ...
        components { withModule<ModularKotlinRule>(kotlin("stdlib")) }
    }
    
    module com.github.kotlin_graphics.kotlin_unsigned {
    
        requires kotlin.stdlib;
    //    requires kotlin.stdlib.jdk8;
    
        exports unsigned;
    }
    

    对于kotlin("stdlib-jdk8"),您需要在kotlin("stdlib")旁边添加它

    dependencies {
        implementation(kotlin("stdlib"))
        implementation(kotlin("stdlib-jdk8"))
        ...
        components { withModule<ModularKotlinRule>(kotlin("stdlib")) }
        components { withModule<ModularKotlinRule>(kotlin("stdlib-jdk8")) }
    }
    

    那么,你的module-info.java就可以了

    module com.github.kotlin_graphics.kotlin_unsigned {
    
    //    requires kotlin.stdlib;
        requires kotlin.stdlib.jdk8;
    
        exports unsigned;
    }
    

    ./gradlew build 为我构建成功。
    我还添加了添加缺少的测试依赖项:

    testImplementation("io.kotlintest:kotlintest-runner-junit5:$kotlintest_version")
    

    更新:列出了 stdlibstdlb-jdk8

    【讨论】:

    • 谢谢,终于成功了。我也试过stdlib-jdk8,它一直说e: Module kotlin.stdlib cannot be found in the module graph。你成功了吗?
    • 我对答案进行了更正。列出了stdlibstdlb-jdk8
    • 它有效。这安全吗?以这种方式导入它们不会有问题吗? (任何干扰或其他)
    • 不,它不应该干扰。 stdlib-jdk8 内部使用 stdlib。在正常情况下,您不必添加stdlib,因为它可以通过stdlib-jdk8 传递。您还可以通过添加它来进行试验 compiletimeonly 并查看它是否在运行时有效。 compileOnly(kotlin("stdlib")) 对于您的库,我建议使用 stdlib,这使得该库可用于 Android 的旧版 Java。
    猜你喜欢
    • 2022-08-02
    • 2017-04-10
    • 2019-03-22
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多