如何解决SKMaps.jar和guava的冲突依赖
How to solve conflict dependence with SKMaps.jar and guava
我正在从事一个使用 Skobbler 的 OSM 的项目。我的项目需要使用一个名为 guava 的 Google 库。我将 SKMaps.jar 放在 libs/SKMaps.jar 上,还有另一个罐子。另一方面,我有一些依赖关系,例如:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:19.1.+'
compile 'com.squareup.okhttp:okhttp:2.2.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
compile group: 'com.google.guava', name: 'guava', version: '18.0'
}
这会在您构建项目时造成冲突,就像这样
Error:Execution failed for task ':app:dexPlatoDebug'.
com.android.ide.common.internal.LoggedErrorException: Failed to run command:
/home/opt/android-studio/sdk/build-tools/21.1.0/dx --dex --no-optimize --output /home/alex/Android/proy/app/build/intermediates/dex/plato/debug --input-list=/home/alex/Android/proy/app/build/intermediates/tmp/dex/plato/debug/inputList.txt
Error Code:
2
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/google/common/annotations/Beta;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:302)
at com.android.dx.command.dexer.Main.run(Main.java:245)
at com.android.dx.command.dexer.Main.main(Main.java:214)
at com.android.dx.command.Main.main(Main.java:106)
正如我们在这里看到的,冲突的产生是因为 SKMaps 依赖于
Lcom/google/common/annotations/Beta;
我说 SKMaps 是因为我一直在一个副项目上做一些测试来检测哪些 jars 有冲突,SKMaps.jar 和 guava 组合有这种冲突。现在这是我的问题:
如何排除 SKMaps.jar 对番石榴的依赖?
或
是否可以将两个 jar 放在一起而不引起冲突?
谢谢
有两个选项,第一个比第二个更容易:
正在从已编译的 'SKMaps.jar' 文件中删除 Google 包
- 备份 SKMaps.jar 文件
- 打开带有存档的 .jar 文件 reader,例如。 7zip
- 从 3 个文件夹中,输入 'com' -> 然后 select google 文件夹并将其删除
- 关闭存档自动保存,此后不会出错
- *但是你必须确保 Guava 库的可用性以及项目中的 SKMaps.jar(将其包含在 lib 文件夹中)
编写一个gradle脚本反编译SKMaps.jar并在排除com/google/文件夹的情况下重新编译它(这与第一个选项基本相同) 并在构建过程中包含新的 jar
- 不同的是,这个选项不会修改原来的SKMaps.jar,而是在没有重复包的情况下制作一个副本
无论采用哪种方法,项目都可以顺利编译。
我正在从事一个使用 Skobbler 的 OSM 的项目。我的项目需要使用一个名为 guava 的 Google 库。我将 SKMaps.jar 放在 libs/SKMaps.jar 上,还有另一个罐子。另一方面,我有一些依赖关系,例如:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:19.1.+'
compile 'com.squareup.okhttp:okhttp:2.2.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
compile group: 'com.google.guava', name: 'guava', version: '18.0'
}
这会在您构建项目时造成冲突,就像这样
Error:Execution failed for task ':app:dexPlatoDebug'.
com.android.ide.common.internal.LoggedErrorException: Failed to run command: /home/opt/android-studio/sdk/build-tools/21.1.0/dx --dex --no-optimize --output /home/alex/Android/proy/app/build/intermediates/dex/plato/debug --input-list=/home/alex/Android/proy/app/build/intermediates/tmp/dex/plato/debug/inputList.txt Error Code: 2 Output: UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Lcom/google/common/annotations/Beta; at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596) at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554) at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) at com.android.dx.merge.DexMerger.merge(DexMerger.java:189) at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:302) at com.android.dx.command.dexer.Main.run(Main.java:245) at com.android.dx.command.dexer.Main.main(Main.java:214) at com.android.dx.command.Main.main(Main.java:106)
正如我们在这里看到的,冲突的产生是因为 SKMaps 依赖于
Lcom/google/common/annotations/Beta;
我说 SKMaps 是因为我一直在一个副项目上做一些测试来检测哪些 jars 有冲突,SKMaps.jar 和 guava 组合有这种冲突。现在这是我的问题:
如何排除 SKMaps.jar 对番石榴的依赖?
或
是否可以将两个 jar 放在一起而不引起冲突?
谢谢
有两个选项,第一个比第二个更容易:
正在从已编译的 'SKMaps.jar' 文件中删除 Google 包
- 备份 SKMaps.jar 文件
- 打开带有存档的 .jar 文件 reader,例如。 7zip
- 从 3 个文件夹中,输入 'com' -> 然后 select google 文件夹并将其删除
- 关闭存档自动保存,此后不会出错
- *但是你必须确保 Guava 库的可用性以及项目中的 SKMaps.jar(将其包含在 lib 文件夹中)
编写一个gradle脚本反编译SKMaps.jar并在排除com/google/文件夹的情况下重新编译它(这与第一个选项基本相同) 并在构建过程中包含新的 jar
- 不同的是,这个选项不会修改原来的SKMaps.jar,而是在没有重复包的情况下制作一个副本
无论采用哪种方法,项目都可以顺利编译。