参考资料:带你认识SourceSet
SourceSet是做什么的?
SourceSets被称作源代码集合,一般可以用它来指定资源的路径(项目下src),是Java插件用来描述和管理源代码及资源的一个抽象概念,是一个Java源代码文件和资源文件的集合,我们可以通过sourceSets更改源集的Java目录或者资源目录等。
写在前面:gradle中有两个sourceSet,一个是android.sourceSet{},另一个是sourceSet{},前者是android插件的sourceSet,后者是Java插件的sourceSet,官方文档中说明的是java插件的sourceSet,Android的只能看源码,两者有一些不同本文只做归纳,详细参考第一行的参考资料。
java插件引入了一个概念叫做SourceSets,通过修改SourceSets中的属性,可以指定哪些源文件(或文件夹下的源文件)要被编译,哪些源文件要被排除。Gradle就是通过它实现Java项目的布局定义。
SourceSets目录结构是固定的Java的标准项目目录布局,SourceSet是project的一个属性,但是需要注意gradle中的SourceSets首字母小写,不然会报错。
java.sourceSet如何使用?
sourceSets {
main {
println "name:"+getName() //name:main 同m_java.name
SourceSet m_java = java {
println "name:"+getName() //name:java
}
SourceDirectorySet set = getJava()
println "my_java:"+m_java.name +" size:"+set.size() //my_java:main size:1
}
println "my_java:"+m_java.name //my_java:m_java
}
android.sourceSet如何使用?
android{
sourceSets {
main {
println java.name //main Java source
//在sourceSets中配置指定的Manifest文件(例如在组件化开发中, 我们需要针对debug与release模式下, 指定不同的Manifest文件)
if (isDebug.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
//指定其他编译目录
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
java {
// 指定源码目录
srcDir 'src/java'
//加一些不按照java标准的文件夹结构下的java文件(注意不是替换)
srcDir 'src/myJavaPath'
//合并
sourceSets.all{set ->println "${set.name}的文件是 ${set.java.srcDirs}" }
//排除,打包时不包含文件的路径
exclude '/test/**'
println "name:"+getName() //name:main Java source
}
resources {
//指定资源目录
srcDir 'src/resources'
//排除,打包时不包含文件的路径
exclude '/resource/**'
println "name:"+getName() //name:main Java resources
}
assets {
println "name:"+getName() //name:main assets
}
//
Set<File> files = java.sourceFiles.getFiles();
for (File mfile:files){
println "文件名:"+mfile.name
}
}
}
}
SourceSet如何输出
点击build菜单,make/rebuild都可以