2010-01-06 51 views
1

我的應用程序使用Http client2.0.2 jar文件和我的單元測試套裝使用Http client3.1 jar文件。在單一應用程序中配置相同jar的兩個版本

如何在單個應用程序中配置相同jar文件的兩個版本?

+2

爲什麼你針對不同的庫單元測試?單元測試的目的是測試應用程序各個組件的行爲。如果你的單元測試不忠實地重新創建應用程序的環境,那麼有什麼意義? – 2010-01-06 12:59:05

+0

我使用開源的單元測試,這個開源內部使用最新版本的http客戶端(3.1)。但是我在Application中使用了舊版本的jar文件。 – Tony 2010-01-06 13:39:42

回答

2

也許你可以使用jarjar將Http客戶端2.0.2嵌入到你的應用中,讓你的單元測試使用更新的版本。

3

您需要設置兩個不同的類路徑。對於測試(您可能使用像ant這樣的工具運行),將http client 3.1添加到類路徑中。

部署時,然後將http client 2.0.2部署到應用程序服務器。省略測試類和其他版本的http客戶端。

但有一個缺點:你不能測試使用舊的http客戶端的類(當然,至少不是本地的)。因此,我建議將應用程序升級到新版本的庫。

+0

+1:乾淨的解決方案...它是如何netbeans管理這個問題... – 2010-01-06 15:17:19

1

真的不相信你應該對一個罐子進行測試,並部署對另一個。我認爲這是真正的問題。

+0

我使用開源單元測試,這個開源內部使用最新版本的http客戶端(3.1)。但是我在Application中使用了舊版本的jar文件。 – Tony 2010-01-06 13:41:36

1

您可以在應用程序中擁有相同類(或庫)的不同版本。這不是一個大問題,你只需要爲你的庫使用不同的類加載器。

您必須創建一個URLClassLoader來加載您的開源測試應用程序(父類加載器將是系統類加載器),也可能是3.1客戶端版本的另一個類加載器作爲第一個的子加載器。然後從類路徑中移除這些庫並解析並從開源應用程序中'啓動''main'類。它應該直接工作,或者至少爲缺少的步驟提供足夠的提示(NoClassDefFoundError)(以前沒有嘗試過,對不起,這很理論)。看看JavaDoc的java.lang.Classloader類(及其擴展器)

如果需要在單個應用程序中使用同一個庫的不同版本,我會使用OSGi作爲框架,因爲你會得到這個功能是免費的。客戶端軟件包可能依賴於2.0.2客戶端版本,客戶端版本3.1上的測試軟件包。您只需編輯Manifest文件並使用OSGi框架(如Equinox)啓動應用程序。

1

Netbeans的做到這一點非常好:您對進口libraies 2個單獨的文件夾,一個用於測試(測試Librairies),另一個用於您的應用程序(Librairies)...

如果您的IDE不支持此您可以通過亞倫Digulla做手工的建議,並在您的螞蟻的配置定義型動物類路徑......你可以按照這個tutorial做...

相關問題