Gradle 第七讲 之 android插件的入门2 SourceSets

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插件自己的,这里就不细说了

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值