Gradle多模块的项目构建

示例程序拥有两个模块:
     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/

你可能感兴趣的:(Gradle多模块的项目构建)