SourceSets 并非是安卓插件中引入的,而是java插件中引入的,所以只要理解其一,即可贯通,
我们先来介绍一下在java插件中如何使用,
1.gradle的资源路径一般都是固定的,
/src/main/java/***
/src/test/java/***
也就是说我们再不编辑sourceSets的情况下,只有这里面的代码才会被编辑, test中的是测试代码。
Question 1:
现在我想要加一些我需要的java文件,但我们还不想按照这个文件夹结构怎么办呢,
我想在
src/sourceSet
下面加一些代码,并且希望编译进jar包里
sourceSets {
main {
java {
srcDir 'src/sourceSet'
}
}
}
这样当我们gradle build的时候,你会发现我们新添加的路径里的文件也变到最终的jar包里了,
人类是永远无法满足的,所以我要想到了
Question 2:
我想要可以单独打sourceSet下的jar包,不包括main下面的,这样以后方便我模块区分。
其实很简单,这时我们就不需要将新添加对代码添加到main里了,而是自己声明一个sourceSet
sourceSets {
intTest
}
先声明一个intTest的sourceSet再向这里面添加classpath
sourceSets {
intTest {
java {
srcDir 'src/sourceSet'
}
}
}
输入:gradle intTestClasses我们发现在build/classes/中声称了我们的java class,而且只有这个,证明编译成功了
继续向目标前进,我们希望达成jar包,
我们定义一个声称jar包对task
task intTestJar(type:Jar){
from sourceSets.intTest.output
}
wudideMacBook-Pro:gradle ***$ gradle intTestJar
:clean UP-TO-DATE
:compileIntTestJava
:processIntTestResources UP-TO-DATE
:intTestClasses
:intTestJar
编译成功,下面到build/libs/下面看到了生成的jar文件,这个jar文件中只有我们的sourceSet文件夹下的类
这时问题又来了,这样如果我有多个sourceSet的话,都声称同一个jar文件,就分不清了,
Question 3:
这时我们需要将每个jar文件拷贝到其他目录,并且重新命名
task copyJar(type:Copy){
from('/Users/***/AndroidStudioProjects/gradle/build/libs')
into('/Users/***//AndroidStudioProjects/gradle/out')
include('gradle-3.0.jar')
rename('gradle-3.0.jar','intTest.jar')
}
copyJar.dependsOn(intTestJar)
intTestJar.dependsOn(clean)
这样我们每次执行gradle copyJar的时候,
wudideMacBook-Pro:gradle xiepengchong$ gradle copyJar
:clean
:compileIntTestJava
:processIntTestResources UP-TO-DATE
:intTestClasses
:intTestJar
:copyJar
这样就在指定目录生成制定文件了现在我们的功能已经完成了
Question 4:但我们能不能简化一下代码呢?
我们将
sourceSets {
intTest {
java {
srcDir 'src/sourceSet'
}
}
}
改为
sourceSets {
intTest.java.srcDir 'src/sourceSet'
}
再运行,结果是不是一样呢,所以说两种写法的功能是相同的,然后再将
sourceSets {
intTest
}
这句删除在试试呢?还是ok的,所以这句和下面这句功能也是相同的,有下面的就不需要这个了
Question 5 :我们在上面用到了下面这个,这个是干嘛的呢?
sourceSets.intTest.output
这个我说也未必能说明白,说明白,你也未必能看懂,看懂了也未必记得住,所以我把官方解释放到这,剩下的就靠自己的天赋了。
最后结合我们所学的来了解一下sourceSets在android插件中如何使用的,
android { sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] jniLibs.srcDirs = ['libs'] }
}
不知道大家是否见过,如果我们自己构建AndroidStudio程序,这些是没有的,但是eclipse转到android studio的程序,这个是必须的,
想想也很好理解,studio建立的目录符合/src/main/java的gradle目录结构,所以编译会走默认的就可以了
但是eclipse的目录结构可不是这样的,所以就需要自己设置sourceSets将目录结果按照gradle的标准配置一下,
上面的也很好理解,除了上面java的属性以为,还有一些android插件自己的,这里就不细说了