簡體   English   中英

如何同時使用同一類的不同版本

[英]How to use concurrently different version of the same classes

我必須提供一組Web服務的接口,為此我生成了代碼存根和對象綁定。 許多事務共享一個公共的對象模型,因此生成的代碼大部分重疊。 通常,這不會引起任何問題,因為wsdl將鏈接相同的xsd文件,因此我將僅重復使用相同的代碼。

不幸的是,這些服務的提供者在這里將xsd分開了,因此每個服務都綁定到相同文件的單獨集合(基本上是副本)。 他們在其規范中指出,客戶端的實現應隔離每個Web服務,以便於維護。 基本上,他們希望能夠修改單個Web服務的xsd,同時保持所有其他功能不變。

問題如下:

我如何才能將這些不同的生成類集集成到同一程序中,以使每個服務在不干擾其兄弟的情況下公開其功能?

我認為一種解決方案是為每個對象創建一個外觀,以暴露所需的功能和對象模型,從而使實際實現保持隱藏。 然后,盡管巧妙地使用了自定義類加載器,但每個外觀都將加載一個特定的jar,其中包含該特定服務的生成代碼。

任何想法 ? 想法? 您面對類似問題的經歷是什么?

謝謝

您是否考慮過使用基於OSGi的捆綁軟件(例如Eclipse Equinox運行時)? 使用基於OSGi的實現,每組生成的類將位於一個單獨的捆綁包(.jar文件)中,該捆綁包具有自己的類加載器,並且可以將其API的一部分選擇性地導出到應用程序的其余部分。 因此,它為您提出的解決方案提供了現成的實現。

通常,處理此問題的最簡單方法是使用jaxb綁定文件(或CXF的wsdl2java工具的-p參數)將生成的代碼映射到特定於特定服務的包中。 因此,每個服務都將具有其自己的對象。

如果您必須集成各種服務,則將變得很復雜。 就像從一個人那里獲得回報,再呼叫另一個人一樣。 由於對象將完全不同,因此您需要編寫代碼以將數據從一個復制到另一個。 可能不好玩。 :-(

對於Java,當兩個類由單獨的類加載器加載時,它們彼此不同。 您可以通過從2個URLClassLoaders加載類的2個版本來利用這一點,這兩個類將各個jar的URL作為類路徑。 如果兩組對象都實現相同的接口,則可能不需要構建2個立面。

更新

是的,罐子不應位於主應用程序的類路徑上。 如果將主應用程序的類加載器設置為URLClassLoaders的父級,則加載的類仍然可以訪問應用程序使用的其余類路徑。

對於static如果它們是常量,則它們可能會被編譯器內聯。 對於靜態變量,每個加載的jar將得到2、1。 如果這些變量在jar的上下文之外使用,則可能必須通過反射其類對象來訪問它們。 您是否需要選擇一個或結合使用取決於應用程序,這是我的猜測,如果您可以在1個應用程序中加載和使用2個版本,則任何靜態變量都只能在相應jar的上下文中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM