2016-07-05 71 views
0

我正在使用某個庫的兩個不同版本。如果用戶選擇一個對象,我會識別創建該對象的庫版本。現在我需要運行與該版本相對應的代碼。在運行時加載和卸載不同版本的jar

問題是,這兩個庫版本中的代碼都是多餘的,每個版本僅對用該版本創建的對象有效。我認爲,其後果是,我需要做在運行時執行以下操作:

  • 卸罐,不需要的
  • 裝入罐子,是需要的。

使用URLClassLoader可能嗎?有點像這樣?

File dirVersion3= new File("lib/dirVersion3"); 
File dirVersion4= new File("lib/dirVersion4"); 
URL[] url={dirVersion4.toURL()}; 

ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader(); 
URLClassLoader loader = new URLClassLoader(url, currentThreadClassLoader); 
Thread.currentThread().setContextClassLoader(loader); 
+0

這是部署在應用服務器上的程序的一個獨立的Java類或部分? – Sampada

+0

基本上,如果您爲每個庫創建一個新的類加載器,則可以同時提供兩個版本。如果你用兩個不同的(對等)類加載器加載同一個類,你會注意到由CL1加載的'ClassA'與CL2加載的'ClassA'不同,因爲CL是加載的類對象的一部分!您可以將通用代碼重構爲兩個JAR版本都使用的庫,使用通用CL或應用CL加載公共JAR,並將此CL用作特定於版本的CL的父代。 –

回答

0

我覺得你有2種選擇:

  1. 重新包裝一個庫的版本jarjar(https://github.com/shevek/jarjar),所以它得到不同的包名。這樣,您可以同時在同一個ClassLoader中加載兩個版本。
  2. 創建2類加載器加載其一個庫版本各寫了很多的代表團和反射代碼