我有一个依赖于两个 jar 文件的 android 项目。每个 jar 文件都包含 org.slf4j.impl.StaticLoggerBinder。这个类的实现在每个文件中都是不同的。当我尝试构建它时导致以下异常:
com.android.dex.DexException: Multiple dex files define Lorg/slf4j/impl/StaticLoggerBinder;
其中一个库是 logback-android,另一个是闭源的。
有什么方法可以让这两者都起作用吗?
最佳答案
在 Java 中不禁止使用两个包含相同类的 jar,但这是危险的,这就是 Android 保守并引发错误的原因。
可能发生的情况是,当类有两个不同版本(例如 1.0 和 1.1)时,在加载类时,一个或另一个以无法真正预测的方式加载。因此,如果编译器让您在 1.1 版上调用给定方法,JVM 将找不到该方法,因为它加载了没有它的 1.0 版。将方法替换为其他所有内容(构造函数、字段等),并考虑到这通常发生在完整的包而不是单个类中,因此您将有很多 1.1 版的类在 1.0 版的其他类上找不到方法,并且等等。
Java 本身对此并没有标准的解决方案。然而,jar 文件只不过是 zip 文件,除非它们被签名,否则它们可以被打开、修改和重新压缩。
您可以打开闭源 .jar,删除它的 org/slf4j 文件夹,重新打包,然后尝试它是否适用于其他版本的 org.slf4j。
或者更好的是,告诉那些人拥有一个“单个 jar ”,里面装着各种东西并不比把 jar 分开酷。
关于java - 我应该如何处理具有相同名称但不同类的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25633425/