示例程序拥有两个模块:
core模块包含一些通用的组件,它们能够被程序的其他模块使用。例子中,只包含一个类:MessageService类返回‘Hello World!’字符串。该模块有两个依赖:Junit 4.11与commons-lang3。
app模块包含HelloWorld类,是程序的开端,它从MessageService对象中获取信息,并将接收到的信息写入一个日志文件中。该模块拥有两个依赖:它需要core模块,还使用Log4j作为日志。
下面,我们将创建一个多项目的Gradle构建,包括两个子项目:app 和 core。首先肯定是创建项目multiproject根目录。
1.在根目录下建立模块的目录并配置build.gradle文件
首先需要创建两个模块对应的目录:app、core。分别在对应的目录创建build.gradle文件并配置:
apply plugin: 'java'
repositories {
mavenCentral()
}
task "mkdirs" << {
sourceSets*.java.srcDirs*.each { it.mkdirs() }
sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}
分别运行gradle mkdirs任务会自动创建好src目录。
2.对包含在多项目构建中的项目进行配置
可以通过以下步骤,对包含在多项目构建中的项目进行配置:在根项目的根目录下创建settings.gradle文件,它指明了那些包含在多项目构建中的项目。
settings.gradle配置如下:
rootProject.name = 'multiproject'
include 'app','core'
3.配置core模块的build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.4'
testCompile group: 'junit', name: 'junit', version: '4.11'
}
task "mkdirs" << {
sourceSets*.java.srcDirs*.each { it.mkdirs() }
sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}
4.配置app模块的build.gradle
首先先说下,如果多项目构建拥有项目A和B,同时,项目B的编译需要项目A,可以通过在项目B的build.gradle文件中添加以下依赖声明来进行依赖配置。dependencies { compile project(:A)}
故app项目的build.gradle文件如下:
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile 'log4j:log4j:1.2.17'
compile project(':core')
testCompile group: 'junit', name: 'junit', version: '4.11'
}
jar {
from {
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
}
manifest {
attributes 'Main-Class': 'org.zero.HelloWorld'
}
}
直接运行任务gradle build,在app目录下build/libs/会生成app.jar的可执行的jar文件,java –jar app.jar即可运行app程序。
5.移除重复配置
当对多项目构建中的子项目进行配置时,在core和app项目的构建脚本中添加了重复的配置。都使用Java插件、都使用Maven2中央仓库等。
可以将这项配置转移到根项目的build.gradle文件中,在此之前,必须先学习一下如何在根项目的build.gradle文件中配置子项目。
如果想要在一个称为core的子项目中添加配置,那么就必须在根项目的build.gradle文件中添加以下片段:
project(:core) {
//Add core specific configuration here
}
换句话说,如果想要将重复的配置转移到根项目的构建脚本中,就必须将以下配置添加到build.gradle文件中:
project(:app) {
apply plugin: java;
repositories {
mavenCentral()
}
}
project(:core) {
apply plugin: java;
repositories {
mavenCentral()
}
}
不过这种做法在实质上并没有改变什么,在构建脚本中依然还存在重复配置,唯一的区别是重复配置现在转移到了根项目的build.gradle文件中。
如果想要在根项目的子项目中添加通用的配置,需要将以下片段添加到根项目的build.gradle文件中:
subprojects {
//Add common configuration here
}
于是在根项目的build.gradle文件可以这样修改:
subprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
}
task "mkdirs" << {
sourceSets*.java.srcDirs*.each { it.mkdirs() }
sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}
}
此时app、core会拥有同subprojects内容一样的配置。
如果配置项是被多项目构建中的所有项目所共享的,那么也可以在根项目的build.gradle文件中添加以下片段:
allprojects {
//Add configuration here
}
参考:http://blog.jobbole.com/84471/