解决AAR包引用第三方依赖无效

"一次工作总结"

Posted by hbl on 2017-03-16

解决AAR包引用第三方依赖无效

遇到一个之前都没有注意到的问题,在拆分公共组件的时候,将一些公用模块打成aar,然后放到公司的私服maven上,出现这样一个问题,有的aar中引用了类似RxJava,Okhttp等第三方库,发现在主项目中仍需要添加相应依赖才能使用,按理来说,正常使用module的时候,主项目应该也是可以直接使用module中的依赖才对,不清楚为什么会出现这种原因,然后就各种查资料,查看公司maven中的pom文件等等方式,出现了分歧。

A 方案

作为一个反面例子。我第一反应是去查aar包中是否能使用compile这种方式的依赖,查到的都是一些垃圾,完全没有用的东西,然后又人说需要本地jar是可用的,远程依赖不行,之后又把aar文件打开看了看,确实没有远程依赖的jar,之后的思路就是想办法把当前项目依赖的远程库的jar移动到本地项目目录中,这样不aar打包的时候不就把第三方的带过去了嘛。当然这是反面例子。

B 方案

作为一个成功例子。公司老司机。第一反应是Gradle应该是支持这种多层依赖方式的,老司机先google了相关资料,然后去了解maven的加载机制,之后就去看了gradle的源码,并没有从网络上查各种二手的解决方式,然后经过大概两个小时之后,老司机告诉我解决了,当时我还在冥思苦想怎么从获取当前项目所依赖的jar包。

解决方案

源码中的注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
* apply plugin: 'java' //so that I can declare 'compile' dependencies
*
* dependencies {
* compile('org.hibernate:hibernate:3.1') {
* //in case of versions conflict '3.1' version of hibernate wins:
* force = true
*
* //excluding a particular transitive dependency:
* exclude module: 'cglib' //by artifact name
* exclude group: 'org.jmock' //by group
* exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group
*
* //disabling all transitive dependencies of this dependency
* transitive = false
* }
* }

如果本地有gradle的源码,点击compile是可以跳转过去的,然后从最上面往下看,就会发现这段代码,其中最后一个标识:transitive ,表示当前依赖是否可以传递,默认是false,然后当使用aar的时候直接在主项目中加上这句话就可以了。具体的还有一些其他的使用有兴趣的可以自行去了解。

总结

不是说我大天朝不好,也不是说国内的技术环境差,这个事情给我最大的感觉就是,百度真是不行,你看到的和你想要知道根本就是刘亦菲和如花的区别,根本没有用,而且抄袭的气氛太严重,全是一样的内容,搬来搬去的,有什么意思?还有就是自我的总结,解决问题能力不行,习惯了吃二手的资料,不劳而获,会越来越降低解决问题的能力。同样的事情,我用了两个小时,收获甚微,而且没有解决,老司机也是两个小时,看了五六篇源码,了解其运行机制,并成功解决。这差距。。。