2014-09-02 42 views
2

我有一個依賴兩個jar文件的android項目。每個jar文件都包含org.slf4j.impl.StaticLoggerBinder。這個類的實現在每個文件中都是不同的。當我嘗試建立這是導致以下異常:我應該如何處理具有相同名稱但不同類的依賴關係?

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

其中一個庫是的logback-Android的,另一種是封閉源代碼。

有沒有什麼辦法讓這些都正常工作?

+0

可以使用完全合格的名稱,以避免歧義引用的類。不過,我不確定這是最好還是最有效的方法。 – NonSecwitter 2014-09-02 22:33:30

+0

@NonSecwitter - 你錯過了這一點。這些類具有相同的完全限定名稱。 – 2014-09-02 22:34:36

+0

封閉源的聲音包含slf4j;也許你可以從logback-android中省略它,並讓所有東西都可以工作 – antlersoft 2014-09-02 22:35:14

回答

1

有兩個罐子裏面同一類沒有在Java中禁止的,但是是危險的,這就是爲什麼Android是比較保守和引發錯誤。

可能發生的是具有類的兩個不同版本(比如1.0和1.1),加載類,一種或另一種獲取沒有真正預見的方式加載時。所以,如果編譯器讓你在版本1.1上調用一個給定的方法,那麼JVM就不會找到那個方法,因爲它加載了沒有它的版本1.0。將方法替換爲其他所有內容(構造函數,字段等),並且認爲這通常發生在完整包而不是單個類中,所以您將有很多1.1版的類未找到其他1.0版的方法,等等。

Java本身沒有一個標準解決這個。但是,jar文件不過是zip文件,除非它們被簽名,否則它們可以打開並修改並重新打開。

你可以打開封閉源代碼的.jar,除去它的組織/ SLF4J文件夾,再罐子它,並嘗試如果它與org.slf4j其他版本的作品。

或者更好的是,告訴那些傢伙,有一個「一個jar」每樣東西里面是不是不必分離罐冷卻器

+0

與您的最後一個提示。他們非常適合去除它。 – rhnoble 2014-10-15 18:14:25

相關問題