java - 我应该如何处理具有相同名称但不同类的依赖项?

标签 java android dependencies slf4j logback

我有一个依赖于两个 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/

相关文章:

gradle - 是否可以在整个项目中强制使用特定的库版本?

Java XML - 将字符转换为实体

java - 从外部 bean 注入(inject) bean 属性

Java 泛型类型参数

android - 测试后台数据和包数据是否开启

java - 排除依赖 Gradle

java - 未能应用插件 [class 'io.spring.gradle.dependencymanagement.DependencyManagementPlugin']?

java - JPA 的 Servlet 字符编码问题

android - 有条件地显示按钮

android - Activity 流程