2011-06-21 232 views
9

假設我有一個java項目myProject,並使用外部庫jar(someJar.jar),它具有com.somepackage.Class1.class類。如何避免Java中的「重複類」

現在我找到了更新版本的Class1.java,它修復了原始jar中的錯誤。

我包括我的源代碼的新Class1.java下包com.somepackage

當我生成項目(例如,使用NetBeans),有一個dist\myProject.jar含有類com.somepackage.Class1.classdist\lib\someJar.jar其中還包含有一類同名。

當我運行該文件(例如,使用java -jar dist\myProject.jar)時,會使用新版本Class1.class(如我所願)。

  1. Java如何決定在重複的情況下運行哪個類文件?有什麼方法可以指定優先級嗎?

  2. 有沒有「正確」的方法來避免這種衝突?

  3. 在Proguard中,當我嘗試壓縮我的代碼時,出現duplicate class錯誤。我如何消除這種情況?

回答

4
  1. Java根據類路徑的順序決定使用哪一個。列出你的第一個,你會沒事的。

  2. 「正確」的方法是修復原始來源,但有時候並不總是一種選擇。

  3. 我還沒有使用過ProGuard,但在重複類之前,我重新打開了庫。我的解決方案是告訴Ant忽略重複的類。我認爲ProGuard也會有這種支持。

6

你不能創建一個包含錯誤修復的更新的jar文件嗎?如果你沒有相同的完全合格課程的兩個版本,它會讓事情變得更簡單。

+0

我可以那樣做。但是,如果將來某人用升級版本(沒有錯誤修正)替換該jar,則更改將會丟失。我更願意將java源代碼保留在項目中,以確保bug修復不會丟失。是否有可能在構建工具中完成?注意:錯誤修復不是庫的官方版本的一部分,也可能不是下一個版本的一部分。 – Jus12

+0

@ Jus12:當然,您可以創建一個更新的jar文件作爲構建過程的一部分,創建一個jar文件的副本,然後更新該類。但是,我會說你仍然有問題 - 這個類可能*已經在新版本的jar文件中更新,所以使用獨立的bug-fix類文件會導致問題。是否有任何理由爲什麼bug修復*不會成爲新版本jar的一部分? –

+0

我正在討論'smack' xmpp庫,並且bug-fix是對'BOSH'的額外支持。截至目前,smack不支持BOSH,這種攻擊是必不可少的。不知道他們爲什麼不支持它。 – Jus12

1

1)更新的Jar是一個更好的解決方案。

2)使用不同的類名稱。是否有理由,爲什麼你想使用相同的類名和相同的包裝?我認爲沒有理由。

3)創建一個包裝/代理類,封裝了所有的罐子的電話,用戶可以決定調用修復了這個bug這個新類(提供有不同的名稱和包裝)

+3

如果這個類(包含它的bug)被第三方代碼實例化,你可以只是提供一個新的,獨特的課程。 –

+0

是的,這就是我必須保持同一個名字的原因。 – Jus12