介绍–
sourceSet与项目结构有关,和maven一样,在默认的情况下,项目的目录结构是固定的Java的标准项目目录布局,只不过maven是不可以修改的,但是Gradle可以修改。
java插件引入了一个概念叫做SourceSets,通过修改SourceSets中的属性,可以指定哪些源文件(或文件夹下的源文件)要被编译,哪些源文件要被排除。Gradle就是通过它实现Java项目的布局定义。
目录–
Java插件默认实现了两个SourceSet,main和test。每个SourceSet都提供了一系列的属性,通过这些属性,可以定义该SourceSet所包含的源文件。比如,java.srcDirs,resources.srcDirs。Java插件中定义的其他任务,就根据main和test的这两个SourceSet的定义来寻找产品代码和测试代码等。
默认目录
src {
main{
java
res
}
test{
java
res
}
}
新建gradle项目看到的是上面这个目录结构
如何修改–
**在构建脚本中,怎么样定义或者修改SourceSet呢?**Gradle提供了一系列的DSL,可以让你方便的定义或者修改配置。比如,sourceSets的DSL。
sourceSets {
main {
java {
srcDir 'src/java' // 指定源码目录
}
resources {
srcDir 'src/resources' //资源目录
}
}
}
修改指定目录还有一种场景经常用的,那就是eclipse项目转Android studio项目,需要重新配置项目结构 如下:
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest.setRoot('tests')
}
新增目录–
sourceSets最主要的作用不是修改项目目录,而是增加新的目录约定,比如,你想要定义一个新的SourceSet来管理集成测试的源文件,这样可以将单元测试和集成测试分开管理。
1、需要定义一个sourceSet :
sourceSets {
integrationTest
}
2、扩展sourceSet,用runtimeClasspath 举例,
sourceSets {
integrationTest {
compileClasspath += sourceSets.test.runtimeClasspath
runtimeClasspath += sourceSets.test.runtimeClasspath
}
}
3、定义了一个专门的任务,运行集成测试
task integrationTest(type: Test) {
}
用来告知test task,测试类和测试路径用来代替默认的test sourceSet
task integrationTest(type: Test) {
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
4、自动运行测试(可选)
integrationTest.dependsOn test
5、自动运行检查(可选)
check.dependsOn integrationTest
6、添加Java,resource目录到sourceSet,idea会自动创建Java,resource目录为每一个设置,如果他们不存在(可选)
sourceSets {
integrationTest {
java
resources
}
}
完整文件配置:
apply plugin: 'java'
sourceSets {
integrationTest {
// not necessary but nice for IDEa's
java
resources
compileClasspath += sourceSets.test.runtimeClasspath
runtimeClasspath += sourceSets.test.runtimeClasspath
}
}
task integrationTest(type: Test) {
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
integrationTest.dependsOn test