自定义task生成jar包

来源:互联网 发布:联通申请开通80端口 编辑:程序博客网 时间:2024/04/26 06:11

背景:之前转载过别人的在build.gradle中自定义task来打Jar包的文章

文章地址:http://blog.csdn.net/u010479969/article/details/76096162


如果是简单的单一工程需求,这个完全可以满足,但是作为如果想要支撑全公司的业务,这样就有一些麻烦了,如果公司有十个产品线,则需要十个产品线都加入这些代码,感觉还是挺麻烦的

所以想要开发自定义gradle插件,来实现这个功能,接入成本会降低一些.

好久没有写自定义插件了,所以这里记录下来,也是防止以后忘记。



首先记录一下,我们常规开发gradle插件的套路,

1.创建extensions来传递数据

package com.plugin.buildtoolimport org.gradle.api.Project/** * */class ProviderJarPluginExtension {    def archiveName = "provider.jar"    def srcClassDir = ""    ProviderJarPluginExtension(Project project){        archiveName = project.name+".jar"        srcClassDir = project.buildDir.absolutePath + "/intermediates/classes/release"    }}

project.extensions.create('providerJar', ProviderJarPluginExtension,project)

2.加入task

project.task(ProviderJarTask.NAME,type:ProviderJarTask, dependsOn: 'assembleRelease')

3.创建task

import org.gradle.api.tasks.bundling.Jar/** * */class ProviderJarTask extends Jar {    static final String NAME = "providerJar"    String archiveName    String srcClassDir    ProviderJarTask() {        group = "hummingbird"        description = ""        if(archiveName == null){            archiveName = project.providerJar.archiveName        }        if(srcClassDir == null){            srcClassDir = project.providerJar.srcClassDir        }        from(srcClassDir)    }}

这样就可以完成一个插件话开发

然后

./gradlew providerJar

就会在build/libs/下生成project.name.jar文件,


我们也可以,将jar包移动到我们需要的目录下,


扩展:我们还可以增加过滤等手段来处理我们的jar包


扩展:增加过滤的文件类型,例如,过滤掉某些R.class类型文件

    ProviderJarTask() {        if(srcClassDir == null){            srcClassDir = project.providerJar.srcClassDir        }        if(archiveName == null){            archiveName = project.providerJar.archiveName        }        from(srcClassDir)        String packageName = project.android.defaultConfig.applicationId   //获取当前工程包名        String p = packageName.replace('.',File.separator);  //将包名转化为路径        exclude{            if(!it.path.startsWith(p)){   //当前包名下的R不过滤,其他的R统统删掉                it.name.endsWith('R.class');            } else {                return false            }        }        exclude {            if(!it.path.startsWith(p)){                it.name.startsWith('R$');            } else {                return false            }        }    }


原创粉丝点击