我有一个依赖于两个jar文件的android项目。每个jar文件都包含org.slf4j.impl.StaticLoggerBinder。每个文件中此类的实现都不同。当我尝试构建时,会导致以下异常:
com.android.dex.DexException: Multiple dex files define Lorg/slf4j/impl/StaticLoggerBinder;
其中一个库是logback-android,另一个是闭源。
有没有办法让这些都起作用?
答案 0 :(得分:1)
在Java中禁止使用两个具有相同类的jar,但这是危险的,这就是为什么Android保守并引发错误的原因。
可能发生的是,有两个不同版本的类(比如1.0和1.1),在加载类时,一个或另一个以无法预测的方式加载。因此,如果编译器允许您在版本1.1上调用给定方法,那么JVM将找不到该方法导致它加载版本1.0而没有它。将方法替换为其他所有内容(构造函数,字段等...),并考虑通常这种情况发生在完整包而不是单个类中,因此您将拥有许多版本1.1的类,而不是在其他类版本上查找方法1.0等等。
Java本身没有标准的解决方案。但是,jar文件只不过是zip文件,除非它们已经签名,否则它们可以被打开和修改并重新震撼。
您可以打开已关闭的源.jar,删除它的org / slf4j文件夹,重新jar,然后尝试使用其他版本的org.slf4j。
或者更好的是,告诉那些家伙有一个" 单罐"里面的各种东西都不比把罐子分开的凉爽。