库冲突一般原因
- 同一个库,引入了多个不同的版本,导致类重复
- 同一个类,在不同的库中都包含了,导致类重复
查找导致类冲突的Libarary
类冲突在编译时一般会报以下错误:Program type already present
复制类名,双击Shift,输入类名搜索,点击Class,再点击定位,即可定位到Libarary位置
如果类有重复的话,一定会有多个位置都包含相同的Class 查找导致库冲突的Dependency
找到了冲突的库,但是我们还是不知道这些库来自Gradle中的哪些依赖,因为Gradle中的一个依赖往往对应多个jar包
这时我们可以打开【File】-【Project Structure】-【Dependencies】界面来查看Gradle依赖明细
选中一个Module,点击【See Dependencies】按钮,就能看到这个模块的依赖明细
我们可以看到,Gradle中的一个依赖下面,都会包含诸多的子依赖关系,逐个查找就能找到有冲突的依赖
也可以点击最右侧面板,输入单词直接进行搜索 排除有冲突的Dependency
当两个依赖都引入了同一个库时,我们选择其中一个依赖,将冲突的库从这个依赖中排除即可
//GIS工具库:GeoTools
api('org.geotools:gt-shapefile:25.0', {
exclude(group: 'jakarta.annotation', module: 'jakarta.annotation-api')
})
排除重复的Resource
jar包中不止包含代码,还能包含so库,assets资源,jar包描述文件,其它与程序无关的文件等等
当这些资源文件重复,编译时一般会报以下错误:More than one file was found with OS independent path
这时我们可以在gradle文件中通过packagingOptions排除这些无用的资源,如果有多个模块,要将这个选项写到主模块的gradle文件中
packagingOptions {
doNotStrip "*/*/libdjivideo.so"
doNotStrip "*/*/libyuv2.so"
exclude 'META-INF/*'
exclude 'assets/location_map_gps_locked.png'
exclude 'assets/location_map_gps_3d.png'
exclude 'about.*'
exclude 'plugin.*'
exclude 'modeling32.png'
}
备注
思路都已经清楚了,具体操作就不详细介绍了,网上很容易搜,没那么多时间把博客写成论文