Gradle排除依赖模块的某个类

好久没写文章了,开工第一天来一发开门红。既然没什么可写的,就简单聊聊Gradlew吧,是Gradle,命令敲多了习惯加个w,开个小玩笑。gradle用来构建项目可谓是十分的灵活,刚开始接触也许觉得有点懵,觉得这个东西就是多余的,但是用多了就真的会爱上它。
我之前做组件化的时候就碰到锅这样一个问题,怎么排除某个类

Gradle怎么排除所依赖的模块的某各类

其实我觉得在很多的情况下都会碰到这个问题,比如你的老大写了个BaseModule,里面有很多东西,你就没必要造轮子了,但是其实你这个项目中用不到这么多,那就没必要在打包的时候也把多余的代码打进去,但是你又不能删掉,因为很多个模块都依赖这个Base模块,所以你只能用“排除”的方法来去掉多余的代码。再比如你自己的模块和所依赖的模块有同名类,包名都相同的那种,那就肯定编译不过,所以你要排除相同类。甚至还有很多情况需要你在依赖中排除某个类或者某个包。
那么该怎么做?
只要稍微用过gradle构建项目的都知道,如果我们在依赖时出现了相同的jar包,我们是可以排除的

implementation fileTree(include: ['*.jar'], dir: '../balabala/balabala', exclude: ['重复包1.jar', '重复包2.jar'])

这样确实能排除某个jar包来达到解决jar包重复的问题,但是用这种方法你能排除到某个类吗?不能。
比如一般新手写依赖module都会这样写

 implementation project(':testModule')

然后你想排除这个模块中的Test.java 这个文件,你能这样写吗?

 implementation project(':testModule',exclude:['Test.java'])
或者
implementation project(':testModule'){
      exclude :'Test.java'
}

这样写肯定不行,可能闭包的写法写错了,我也不太记得这个的闭包怎么弄来着,好像是

implementation(project(':testModule')) {
    exclude group: 'com.xxx.xxx.Test.java', module: 'testModule'
}

还是这个来着

implementation(project(':testModule'){
    exclude group: 'com.xxx.xxx.Test.java', module: 'testModule'
})

但是这样的做法能排除掉掉这个Test.java吗?我试过是不行的,如果有朋友能用这种方法排除单个文件请告诉我。
既然这种方法没办法排除类,那么要怎么做?

方案一:放弃implementation project,使用sourceSets

sourceSets是java插件的东西,他能把代码文件导入到相应的地方,无论是绝对路径还是相对路径,我之前有写过一篇sourceSets的文章,获取网上也能找到很多关于sourceSets的文章,你把目标Module的java、res、lib等引进来,即使不使用implementation project的方法,也能让这个module能够获取到目标module的东西。而且使用sourceSets的话可以很方便的exclude某个文件。
但是我觉得这样的方法不应该叫做“依赖”,更应该叫做“引用”或者“导入”。
所以这种方法更像是一种对文件的操作,copy的感觉,所以这种方法也就有了不足的地方,假如你在某种情况下需要引用ModuleA,某种情况下引用ModuleB,要么你就加个判断,要么就每次都改代码,要是有两个还好说,要是有20几个Module呢?我们总不能这样玩吧,就算是能,当你每次在gradle中看到这段代码时,相信你也会老阔疼。

方案二:在目标模块就进行排除代码

什么意思呢?比如说你想要依赖ModuleA,但是又想排除某些文件,我们可以直接在ModuleA中进行排除,意思是你依赖的ModuleA就已经少了你想排除的代码。
这样做的话可以让依赖的那一方不用考虑特殊情况,虽然像上面说的情况多的时候也要写挺多代码,但是这些逻辑会很清晰,很容易管理,我个人更倾向于使用这样的方法也排除单个文件。哪怕最上面说的implementation project时exclude能够实现,我依旧更倾向于在某块本身进行排除。
但是我们要怎样控制呢,难道每次都要去修改多个gradle文件吗?其实在gradle中我们可以使用全局变量。

1.创建一个config.gradle写变量
// 配置全局变量
ext{
    configOne = [isRealy:true]
}

假设我这样有一种情况,叫configOne ,这种情况下isRealy这个值是true,这种情况下我们要在引用模块时排除掉某个类。

2.在全局gradle中引用config.gradle
apply from: 'config.gradle'
......
3.在目标gradle中加入构建逻辑

假如我的目标模块 Moudle->myone中有两个类OneLog、TwoLog,然后我想在A模块依赖时这两个类都有,在B模块依赖时没有TwoLog。
在myone的gradle写

def configOne = rootProject.ext.configOne
android {
    .....

     sourceSets{
        main{
            java{
                if(configOne.isRealy) {
                    exclude 'com/example/kylin/myone/TwoLog.java'
                }
            }
        }
    }

}

然后我们在A模块引用时,把isRealy改成false,在B模块引用时把isRealy改成true这样就行了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaoyanj...
    勤奋的pangdunhu阅读 1,936评论 0 1
  • 说明 本文主要介绍和Gradle关系密切、相对不容易理解的配置,偏重概念介绍。部分内容是Android特有的(例如...
    jzj1993阅读 15,390评论 1 62
  • 在 Android Studio 构建的项目中,基于 Gradle 进行项目的构建,同时使用 Android DS...
    Ant_way阅读 7,259评论 0 16
  • 不要让过去成为现在的包袱,轻装上阵才能走得更远。人的心灵就像一个容器,时间长了里面难免会有沉渣。时时清空心灵的沉渣...
    考拉的人生阅读 196评论 0 0
  • 我又回来了。时隔两年之久,我又选择了回来,回归简书。 一直都希望自己可以自律,可以坚持一些什么东西。每日打卡该学习...
    南程阅读 333评论 0 1