是否需要在 module-info.java 和 build.gradle.kts 中指定模块依赖关系

Is it a requirement to specify module dependencies in both module-info.java and build.gradle.kts

这是我的多项目 Gradle 设置:

.
└── gradle-module-project
    ├── application
    ├── build.gradle.kts
    ├── gradlew
    ├── list
    ├── settings.gradle.kts
    └── utilities

applicationutiltieslist是项目,每个项目里面都有一个Java模块。

也就是说,每个项目都有自己的 src/main/java/module-info.java 文件和 build.gradle.kts 文件。

application模块依赖utilities模块,utilities模块依赖list模块。

build.gradle.kts 根目录包含以下内容:

subprojects {
    ..

    plugins.withType<JavaPlugin>().configureEach {
        configure<JavaPluginExtension> {
            modularity.inferModulePath.set(true)
        }
    }
    
    ..
}

我觉得奇怪的是,在每个子项目中,都需要 build.gradle.kts 来列出依赖项。

例如,application -> build.gradle.kts 包含:

plugins {
    application
}

dependencies {
    implementation(project(":utilities"))
}

..

为什么 applicationbuild.gradle.kts 必须包含 implementation(project(":utilities"))

application 中的 module-info.java 已经指定了该模块所依赖的内容时。

这不是重复的吗?

是否打算在module-info.javabuild.gradle.kts中都指定依赖项?

当使用 Java 模块和 Gradle 时,必须指定两次依赖关系:一次是为了模块系统的利益,另一次是为了构建工具的利益。

我一直在关注 Java 9 Modularity 中 Sandor Mak 和 Paul Bakker 的 Easy Text 演示应用程序,这是一个 multi-module 项目。一个模块的 module-info.java 是:

module easytext.cli {
   requires easytext.analysis;
}

当我将其包装在 Gradle 中时,在我的 build.gradle 文件中我还需要:

dependencies {
    implementation project(':easytext.analysis')
}

也许工具赶上来只是时间问题,我们不必两者都做。

另请查看 Paul Bakker 的Java一个演示文稿Building JPMS Modules with Java,其中他介绍了 fine-detail 构建 multiple-module Java/Groovy/Kotlin 个项目 Gradle.