首页 > 解决方案 > 使用 Java 模块构建 Gradle Kotlin DSL 多项目

问题描述

我正在创建一个新项目(使用 IntelliJ IDEA),它将使用:

我在设置 Gradle 以正确构建我的项目时遇到问题。我发现的大多数示例都是针对 Groovy 而不是 Kotlin DSL,并且大多数仅涵盖了我想要的一些功能,但不是全部。

现在我有两个模块,corelib,其中core模块需要lib模块。我的 gradle 构建脚本是:

构建.gradle.kts

plugins {
    base
    kotlin("jvm") version "1.3.41" apply false
}

subprojects {
    afterEvaluate {
        tasks.withType<JavaCompile> {
            inputs.property("moduleName", extra["moduleName"])
            options.compilerArgs.addAll(arrayOf("--module-path", classpath.asPath))
            classpath = files()
        }
    }

    repositories {
        mavenCentral()
        jcenter()
    }
}

核心/build.gradle.kts

extra.set("moduleName", "myproject.core")

plugins {
    kotlin("jvm")
}

dependencies {
    compile(kotlin("stdlib"))
    compile(project(":networking"))
}

库/build.gradle.kts

extra.set("moduleName", "myproject.lib")

plugins {
    kotlin("jvm")
}

dependencies {
    compile(kotlin("stdlib"))
}

这样做,配置失败:

配置项目 ':core' 时出现问题。

无法在额外属性扩展上获取属性“moduleName”,因为它不存在

如果我删除该inputs.property()行配置成功,但核心编译失败(lib编译成功):

任务:core:compileKotlin

e: 在模块图中找不到模块 myproject.lib

我认为问题是我的根build.gradle.kts,但我不知道如何使它工作。谷歌搜索,Gradle 的 Kotlin DSL 有点新,没有被广泛使用,文档也非常稀缺。

任何意见,将不胜感激!

标签: gradlekotlinjava-modulegradle-kotlin-dsl

解决方案


在发布问题后,我自然找到了解决方案。有一个 Gradle 插件可以完全满足这种情况的需要,例如 KotlinDSL:https ://github.com/java9-modularity/gradle-modules-plugin/tree/master/test-project-kotlin

使用插件,我需要做的就是更改根build.gradle.kts文件:

plugins {
    base
    kotlin("jvm") version "1.3.41" apply false
    id("org.javamodularity.moduleplugin") version "1.5.0" apply false
}

subprojects {
    apply(plugin = "org.javamodularity.moduleplugin")

    repositories {
        mavenCentral()
        jcenter()
    }
}

注意:确保您的 module-info.java 文件在javasrc 文件夹中,而不是在kotlinsrc 文件夹中,否则插件将无法检测到模块。


推荐阅读