2011-12-01 39 views
2

我在寫一個Java應用程序,它將加載第三方「驅動程序」。我打算開發一個接口來定義「驅動程序」必須實現的必要方法,以便在應用程序中工作。分享接口

意圖是將「驅動程序」包含在jar文件中。然後第三方「驅動程序」開發人員將被要求實現該界面。

正如我想弄明白這一點,我將「驅動程序」代碼移動到jar中,發現我遇到了麻煩,因爲我在主應用程序和jar文件中都定義了接口。

是否有推薦的方法來實現這種方法,或者我是否以錯誤的方式?

j

回答

6

你基本上定義了一次界面,在一個API jar中。這個jar然後被主應用程序和驅動程序使用。

驅動程序庫然後將此API jar作爲由主應用程序提供的依賴項。

就Maven而言,依賴關係的範圍爲providedcompile

請注意,您應該避免在不同的庫中擁有相同的類兩次,因爲這些類很可能導致類加載問題,類轉換異常等(除非像大多數應用程序服務器一樣,有一些類加載器範圍來隔離應用程序) 。

+3

+1這是正確的答案。這個設計的一個優秀而着名的例子是'servlet-api.jar',它隨Tomcat的每個副本一起提供。 –

-1

如果你真的移動了界面,你需要重建兩個罐子。如果你已經複製了它,那麼你需要給出一個不同的包名

+0

如果你有兩個包含不同包名的接口,它們將是不同的類,當你試圖將實現接口A的驅動程序強制轉換到主應用程序中的接口B時,你會得到'ClassCastException's。 – Thomas

+0

@Thomas嗯,不要以爲你很讚賞我的評論。 – DaveRlz

+0

@DaveRIz它並沒有真正回答如何處理應用程序和驅動程序需要使用的通用接口的問題。這不是重建jar或創建兩個不同的接口。 – Thomas

1

由於接口是你提供的API /庫的一部分,你應該有接口,第三方應該導入你的API(來自你的jar)並實現適當的接口,比如Java API如何提供SQL接口,但不是實際的實現,而MySQL實現Java API接口。如果驅動程序的接口在應用程序外部使用,則可以將它作爲單獨的jar打包,但如果它僅用於與庫的交互,則應該與庫的其餘部分一起打包。

+0

該接口定義主應用程序如何與驅動程序交談。我以爲我可以動態地將驅動程序「添加」到應用程序,並且由於接口定義,應用程序將能夠與驅動程序進行交互。 – tunneling

+0

如何讓幾個驅動程序包都包含該接口?在這種情況下,你會有多個該接口的副本,這很可能會導致問題。 – Thomas

+0

這正是我發現的。 – tunneling