【问题标题】:How should I deal with dependencies with identically named but distinct classes?我应该如何处理具有相同名称但不同类的依赖关系?
【发布时间】:2023-03-08 05:00:01
【问题描述】:

我有一个依赖于两个 jar 文件的 android 项目。每个 jar 文件都包含 org.slf4j.impl.StaticLoggerBinder。这个类的实现在每个文件中是不同的。当我尝试构建时,会导致以下异常:

com.android.dex.DexException: Multiple dex files define Lorg/slf4j/impl/StaticLoggerBinder;

其中一个库是 logback-android,另一个是封闭源代码。

有什么方法可以让这两个都正常工作吗?

【问题讨论】:

  • 您可以使用完全限定名称来引用该类,以避免歧义。不过,我不确定这是最好或最有效的方法。
  • @NonSecwitter - 你没抓住重点。这些类具有相同的完全限定名称。
  • 听上去像是封闭源包括slf4j;也许你可以从 logback-android 中省略它并让一切正常
  • 看他想实现哪一个。
  • @NonSecwitter 你是什么意思?

标签: java android dependencies slf4j logback


【解决方案1】:

在 Java 中不禁止在其中包含两个具有相同类的 jar,但这是危险的,这就是 Android 保守并引发错误的原因。

可能发生的情况是,如果有两个不同版本的类(比如 1.0 和 1.1),在加载类时,一个或另一个会以不可预测的方式加载。因此,如果编译器允许您在 1.1 版上调用给定方法,JVM 将找不到该方法,因为它加载了没有该方法的 1.0 版。将方法替换为其他所有内容(构造函数、字段等),并考虑这通常发生在完整包而不是单个类中,因此您将有很多 1.1 版的类在 1.0 版的其他类上找不到方法,并且以此类推。

Java 本身并没有对此的标准解决方案。然而,jar 文件只不过是 zip 文件,除非它们被签名,否则它们可以被打开、修改和重新 jar。

您可以打开封闭源 .jar,删除它的 org/slf4j 文件夹,重新 jar 并尝试它是否适用于其他版本的 org.slf4j。

或者更好的是,告诉那些人,有一个“一个罐子”里面装着各种东西并不比把罐子分开

【讨论】:

  • 带着你最后的小费去了。他们很乐意将其删除。
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 2011-02-15
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2020-03-30
相关资源
最近更新 更多