2016-03-03 53 views
3

我正在一個項目,其中少數功能POI 2.5版本罐子正在使用,我已經開發了一個新功能,我需要POI版本3.10罐子所以現在問題是,以前的功能是不能正常工作,因爲它是完美的工作poi 2.5版本jar加載的兩個不同版本的罐子在運行時通過java

現在,如果我保持在我的班級路徑poi罐的兩個版本是否有任何方式,只有我可以調用我的班級poi 3.10版本明確地和爲以前的功能poi 2.5版本被稱爲

默認情況下,如果我保留poi罐的兩個版本,然後始終呼叫poi 2.5版本ns的jar所以我想爲我的班級說abc類明確poi 3.10版本正在調用

請指教我可以明確地在這裏使用類加載器,也請指教是否有可能如果我可以動態創建類的對象

class ABC 
{ 

//version of poi 3.10 being called here 
HSSFWorkbook workbookXls = new HSSFWorkbook(); 

} 

類DEF其使用的POI 2.5

class DEF 
{ 

//version of poi 2.5 being called here 
HSSFWorkbook workbookXls = new HSSFWorkbook(); 

} 
+4

這不太容易。它可以用OSGi來完成,但這並不簡單。它可能會更容易修改代碼,以便它只需要一個版本的POI,而不是同時使用兩個版本。 – Jesper

+0

請指教在java中沒有任何方法.. – sss

+0

也請通知OSGI – sss

回答

1

是可以做到這一點早期版本,裝載從不同的類加載器每個瓶中之中。

  1. 移動從當前的classpath
  2. 兩個罐子出父創建爲他們每個人的罐子URLClassLoader的,與你的實際的類加載器
  3. 使用反射來對付POI

你也可以重構一個罐子來改變它的包裝並避免碰撞。如果你正在使用​​的maven,這可以自動完成。

+0

感謝您請求我們展示如何創建一個帶有實際類加載器的url類加載器作爲父類,然後使用g reflection進行感謝 – sss

相關問題