2013-02-27 56 views
3

我在Java中看到了一些關於「循環jar引用」的問題,但我沒有看到任何東西。循環jar參考 - 它可以編譯?

我的問題是:如何建立兩個罐子,其中每個罐子都有方法調用另一個罐子中的類?看起來,每個jar項目中的某些類需要從另一個jar中導入類,因此需要引用構建的類路徑中的另一個jar - 但由於相同的原因,其他jar無法編譯需要。

我可以理解,將所有類編譯爲一個大項目,然後將類打包到具有相互依賴關係的獨立jar中,但由於需要將其他jar包括在classpath中,因此似乎不可能分別編譯每個jar類。

與我的相關性是,我將代碼開發成一個jar供另一個項目使用。但是,現在我需要從另一個項目中消費幾個API調用。我看到要做到這一點的唯一方法是將一些常用的獨立api類分離成第三個項目/ jar,原來的兩個項目都可以包含在他們的類路徑中。

對此有另一種看法嗎?

+3

您需要一些架構師...... ;-)必須避免使用循環引用。 – Aubin 2013-02-27 20:04:03

回答

0

它們不需要在編譯時必須作爲罐子相互引用。它們可以是兩個獨立的項目,只要在開發時配置類路徑以反映這一點,就可以相互引用。

所以,你可以有一個用例場景,其中:

Api1.Class11 references (or imports) Api2.Class21 

Api2.Class22 references Api1.Class12 

這是合法的,因爲雖然在項目級別循環引用,它不是那麼在類級別(想象如果兩個項目合併成一個並且你有這種情況)。

一旦綁定到jar中,客戶端應用程序的責任就是使用它們將兩者都包含在類路徑中,以便它們可以在運行時以這種方式看到對方。

就我個人而言,我認爲這種做法很混亂,但可以做到。爲了清楚起見,我不會使用循環引用。

+0

謝謝。這對我來說似乎是雞和雞蛋的情況 - 獲得至少一個罐子的唯一方法是編譯一個項目中的所有類,然後根據需要製作罐子。我同意我不想這樣做,這就是爲什麼我會建議我們在可能的情況下分解第三個罐子,這樣所有的罐子都可以在正確訂購時獨立生成。 – sb4 2013-02-27 20:37:38

+0

如果你喜歡答案,考慮upvoting和接受作爲答案 – amphibient 2013-02-27 21:37:28

0

最常見的構建工具無法處理循環依賴關係,但只要至少有一個起始二進制版本的兩個jar包,手動增量構建就不能包含循環依賴關係。

由於構建工具無法處理這種依賴關係,實際上很少遇到這種情況,並且被大多數Java開發人員視爲糟糕的設計。

+0

謝謝,我會遠離它 - 我很欣賞專家的意見。 – sb4 2013-02-27 20:38:38