自定义task生成jar包

本文介绍了一种通过自定义Gradle插件简化打包流程的方法。该插件能够为不同产品线提供统一的Jar包构建任务,降低接入成本,并演示了如何创建任务、配置参数及进行文件过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

文章地址:http://blog.youkuaiyun.com/u010479969/article/details/76096162


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

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

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



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

1.创建extensions来传递数据

package com.plugin.buildtool

import 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
            }
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值