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这样就行了。

Android Gradle排除依赖模块的某个类相关推荐

  1. Gradle排除依赖模块的某个类

    好久没写文章了,开工第一天来一发开门红.既然没什么可写的,就简单聊聊Gradlew吧,是Gradle,命令敲多了习惯加个w,开个小玩笑.gradle用来构建项目可谓是十分的灵活,刚开始接触也许觉得有点 ...

  2. Android gradle统一依赖版本:Composing builds

    之前写过一篇Android gradle统一依赖版本:kotlin+buildSrc的集成使用, 两者的区别可以参照再见吧 buildSrc, 拥抱 Composing builds 提升 Andro ...

  3. gradle排除依赖_如何从Gradle中的所有依赖项中排除库

    gradle排除依赖 我正在使用Spring Boot. 默认情况下,Spring Boot带有Logback. 我想使用log4j(出于任何原因..) 为了做到这一点,我不得不排除logback并添 ...

  4. 【Android 修炼手册】Gradle 篇 -- Android Gradle Plugin 主要流程分析

    预备知识 理解 gradle 的基本开发 了解 gradle task 和 plugin 使用及开发 了解 android gradle plugin 的使用 看完本文可以达到什么程度 了解 andr ...

  5. 【Android 修炼手册】Gradle 篇 -- Android Gradle Plugin 主要 Task 分析

    上文回顾 上篇文章里讲了 android gradle plugin 的整体流程,引入插件以后生成了很多 Task,这篇文章就谈谈生成的这些 Task 都有什么用处,以及一些主要 Task 的实现 预 ...

  6. android gradle 设置,android gradle配置指南

    Gradle简介 Gradle 是一个基于Ant和Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,这比我们的ANT使用XML构建配置要灵活的多.在 ...

  7. 排除jar_Gradle排除依赖关系

    Gradle排除依赖关系 在IDE中发现了C3P0的依赖,但是在build.gradle并没有手动导入,所以说某个jar包依赖了,在STS中没有像Maven可以直接查看依赖的窗口 可以在命令行下查看整 ...

  8. Android 5.0 Phone 模块介绍

    ndroid 5.0 Phone 模块代码结构较上个版本发生了很大变化,这样做的好处是代码易于管理和阅读,脱藕,InCallUI可实现客制化. 本篇主要介绍的内容有以下部分: 1:Android 5. ...

  9. 【Android Gradle 插件】Android 依赖管理 ⑥ ( 依赖冲突处理 | transitive 依赖传递设置 | exclude 依赖排除设置 | force 强制指定依赖库 )

    文章目录 一.查询 Android 依赖库的配置 二.通过 ModuleDependency#transitive 依赖传递设置 三.通过 ModuleDependency#exclude 设置排除子 ...

最新文章

  1. LTV 即用户生命周期价值
  2. 比Navicat还要好用的通用数据库管理工具,功能强大还免费
  3. mysql5_pn卸载_windows mySql(5.7.30) 卸载及重装
  4. 惠普电脑怎么截屏_省钱上京东双十一买笔记本电脑怎么买更优惠更划算更省钱最新攻略!联想戴尔华硕炫龙荣ROG神州宏碁惠普...
  5. linux ubuntu QT 下载和安装(Qt Creator)
  6. 2021.02.01 Visual QA论文阅读
  7. [php]数据结构算法(PHP描述) 半折插入排序 straight binary sort
  8. 区块链软件公司:区块链使用程序如何成为战胜商场应战的垫脚石
  9. python爬虫入门,10分钟就够了,这可能是我见过最简单的基础教学
  10. 几种ELK常见的架构模式
  11. 向量与向量空间(vector space)
  12. 信用评分卡 (part 7 of 7)
  13. 显示器/电脑屏幕字体出现重影
  14. 用命令从FTP服务器下载文件
  15. 不是计算机布尔检索命令的是,在计算机信息检索中,用于组配检索词和限字检索范围的布尔逻辑运算符包括哪些?...
  16. 安卓桌面整理app_【小编分享】APP整理大法!跟杂乱无章的手机桌面说拜拜~
  17. uniapp(js)处理过去时间对比现在时间的时间差如几分钟前,几小时前,几个月前(仿照cnode社区)
  18. 墨画子卿第一章第3节:挑衅
  19. foj2198 Problem 2198 快来快来数一数 dp 矩阵快速幂
  20. win10 python 查看安装库的帮助文档

热门文章

  1. 关于java语言继承的说法正确的是_下列关于Java继承的说法中,正确的是( )
  2. WLAN使用的功率单位
  3. 张小庆,在路上-开始(2)第一天上班
  4. Hbulider中,QQ分享到好友,总是提示,分享失败,请检查网络并重试
  5. 计算机发展史谈VR技术,当计算机专业课与校史相遇 复旦学子打造VR校史馆
  6. 什么是GCT考试,GCT考哪些课目(转)
  7. Devops 工具集
  8. atm机编程java_JAVA语言实现的简单ATM提款机系统_亢先生02070708的博客-CSDN博客
  9. 英语从句精简分类讲述
  10. ERROR:ORA-28009: connection to sys should be as sy - [oracle10g]