2013-05-29 74 views
4

我有一個庫用於Java應用程序 - 這對某些功能很重要,但它是可選的。這意味着如果JAR文件不存在,程序將繼續運行。我想開源我的程序,但我不能包含這個庫,這是編譯源代碼所必需的,因爲我有大量的導入語句來使用API​​。我不想維護兩個代碼集。從開放源碼版本中刪除物理jar文件的最佳方法是什麼,但仍然維護代碼以支持其他人仍然可以編譯它的代碼?Java - 創建庫並導入可選

+0

我發現這個例子有助於實現接口。 http://www.janeve.me/articles/dynamic-loading-using-java-reflection-and-properties – JeffG

回答

3

所採用的典型方法是定義包裝器API(即接口)並在開源代碼中包含這些接口,然後提供配置選項,其中可以指定實現某些接口的類的類名稱。

您將導入API接口,而不是將類直接導入到您的開源代碼中。這樣,您就可以開源API,但不會實現您不想開源的部分,或者無法開源。

有很多例子,但是看看JDBC API(接口)和JDBC驅動程序(實現類)的初學者。

3

我非常喜歡用smallworld輸入同樣的東西,只有一個補充。如果這個API是必要的,你可以使用像Maven這樣的項目構建工具來處理項目的依賴關係。如果有人使用pom從源代碼管理中檢查出來,他們可以自行下載依賴關係,而不必將它們包含在源代碼庫中。

3

很可能有多種方式來解決這個問題,這裏有一對夫婦,我能想到的:

  • 如果你只有一對夫婦需要在第三方庫調用方法,你可以使用反思來調用這些方法。它創建了非常冗長的代碼,雖然很難閱讀。

  • 如果你沒有太多使用第三方庫的API,你也可以創建一個單獨的JAR文件,其中包含類的只是一個非功能性的殼庫(只是類型具有相同簽名的相同名稱和方法)。然後您可以使用此JAR進行分發和編譯。在運行時,如果可用的話,你會用真正的JAR替換它。

  • 最常見的方法可能是在獨立的模塊/項目中爲依賴於第三方庫的代碼創建一個包裝API,並可能分發預構建的JAR。這可能違背了你不想維護兩套代碼集的願望,但從長遠來看,這可能證明是最好的,也是較不痛苦的解決方案。