使用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,并找不到正确的方式来重组事情。 我有的问题是:
-
我无法单独建立
service
或web
,因为他们抱怨无法find他们的从属子项目。 (例如,通过service/
目录中的gradle build
。) -
我如何在根级别定义Kotlin
stdlib-jre8
依赖项,所以它不会在我的三个构建文件中重复? -
我的subproject / buildscript任务的根构建文件如何使用相同的存储库定义,以便我不必定义
mavenCentral()/jcenter()
两次?
基本上我通过一些实验/网络资源拼凑了这个构建结构,而且大多数情况下都是工作 ,但是我想要一些正确的方法指导,例如(1)遵循良好的Gradle实践, 2)通过自动导入IDEA仍然可以正常工作。
- 如果你想运行一个模块的构建,你可以运行:
gradle :web:build
- 与在
subprojects
子句中添加存储库的方式相同,您可以在其中添加dependencies
块。 确保只有共享依赖关系在那里。 例如,compile project(':core')
只应该在相关的项目中。 可以有多个dependency
块。 也就是说,使用subproject
子句通常更令人头痛。 因为如果某个模块的依赖关系发生变化,那么你不得不更新它们 - 关于
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()
。
- 由于app:compileDebugKotlin,Jenkins gradle构建失败
- jacoco安卓gradle插件android kotlin项目后android android gradle插件到版本3(测试版)
- Kotlin Dagger2找不到符号ApplicationModule_ProvideApplicationFactory
- Gradle compileKotlin includeRuntime不向jar添加运行时
- 类未find,androidTest中使用Android Studio 3.0.1,Room,Kotlin的空测试套件
- 项目结构上的Android Studio中的StackOverflowError:null
- Kotlin在Android Studio 3.0 Canary 2中使用Android DataBinding
- 将多个源语言文档组合成一个Javadoc JAR
- 用Gradle和Kotlin构建一个可执行的jar