使用IntelliJ IDEA构建Gradle多模块的正确结构

我有一个Kotlin项目,它由三个模块组成:

Core < Service < Web 

结构是:

 build.gradle core/ build.gradle service/ build.gradle web/ build.gradle 

build.gradle文件的结构是:

 buildscript { ext.kotlin_version = '1.1.60' repositories { mavenCentral() jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } subprojects { apply plugin: 'kotlin' apply plugin: 'jacoco' compileKotlin { kotlinOptions.jvmTarget = '1.8' } repositories { mavenCentral() jcenter() } } 

个人构建文件看起来像( core ):

 dependencies { // Kotlin compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" ... } 

service (注意唯一的区别是项目依赖):

 dependencies { compile project (':core') // Kotlin compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" ... } 

有几个我想做的优化,但我仍然在学习Gradle,并找不到正确的方式来重组事情。 我有的问题是:

  1. 我无法单独建立serviceweb ,因为他们抱怨无法find他们的从属子项目。 (例如,通过service/目录中的gradle build 。)

  2. 我如何在根级别定义Kotlin stdlib-jre8依赖项,所以它不会在我的三个构建文件中重复?

  3. 我的subproject / buildscript任务的根构建文件如何使用相同的存储库定义,以便我不必定义mavenCentral()/jcenter()两次?

基本上我通过一些实验/网络资源拼凑了这个构建结构,而且大多数情况下都是工作 ,但是我想要一些正确的方法指导,例如(1)遵循良好的Gradle实践, 2)通过自动导入IDEA仍然可以正常工作。

  1. 如果你想运行一个模块的构建,你可以运行: gradle :web:build
  2. 与在subprojects子句中添加存储库的方式相同,您可以在其中添加dependencies块。 确保只有共享依赖关系在那里。 例如, compile project(':core')只应该在相关的项目中。 可以有多个dependency块。 也就是说,使用subproject子句通常更令人头痛。 因为如果某个模块的依赖关系发生变化,那么你不得不更新它们
  3. 关于repository定义,它们是非常不同的。 buildscript块中的一个被Gradle自己用来查找插件和其他“预建”需求。 子模块上的模块用于查找给定模块中源代码的依赖关系。 如前所述,放置在各自的模块构建脚本上时,管理起来更容易。

更新:

如果你想保留所有模块的相同版本,buildscript中的ext中定义的variables也应该可以从子模块访问: ext.kotlin_version = '1.1.60' ,如果你有多个模块,你可以添加它们喜欢:

 ext { kotlin_version = '1.1.60' junit_version = '4.12' } 

另外,如果你想在模块之间共享代码,你总是可以把它提取到gradle文件中,并在需要时使用: apply file: "$rootDir/path/to/script.gradle"

关于#3,我会给你一个实际的例子。

Google有自己的Maven仓库,其中包含了所有的android模块的依赖关系。 如果您有一个包含服务器端模块和android模块的项目,您可能不需要服务器端查找Gradle artefact存储库(artefact是jar依赖项的名称)的依赖关系。

至于buildscript存储库,在你的情况下,你只加载一个位于mavenCentral()上的类路径(预mavenCentral() )依赖关系,所以你可以在这里删除jcenter()