2011-08-30 33 views
5

我面臨以下問題:我的webapp中有一個模塊需要jaxb 1.x,另一個模塊需要jaxb 2.x.第一個模塊不適用於新版本的jaxb,而相反。我如何在一個項目中使用這兩個罐子? 謝謝。java:在一個webapp中使用兩個版本的相同的庫

+1

你能描述一下你說 '在我的web應用程序模塊' 的意思。例如,他們是分開的ejb模塊,還是他們只是分開的層共享相同的類路徑?另外,你能列出哪些libs依賴於JAXB jar嗎? –

+0

你可以將模塊看作一個lib(它更復雜,但最後我有通過classpath鏈接到我的webapp的jar文件)。第一個是docx4j.jar,第二個是與WebService一起工作的第三方助手。我不能更改第三方幫助程序和docx4j.jar – Nick

回答

2

你有一個jar-hell問題。一般來說,在普通的Java環境中,解決這個問題是不可能的。您必須使用OSGI強制模塊化到您的項目中。起始點:http://www.osgi.org/About/HowOSGi

5

對於常規應用程序,通常使用不同的版本使用不同的軟件包名稱。如果是這種情況,您可以立即使用它們,而不會出現問題。但是,如果它們相同,則可以使用jarjar來重命名包。

但是,由於您使用的是Web容器,因此每個應用程序應該使用您部署的版本,而不是其他版本。即Web容器爲您工作。

OSGi是其中更明確管理版本,並讓您對這些問題更多的控制(不過我相信你需要它只是爲這個)

+0

是的,我可以將程序包重命名爲jaxb 2.1 jar,但我不想這樣做。這是因爲解決方案是「髒」的。 OSGi是的,但只有當沒有其他解決方案...嗯....重命名似乎越來越合適) – Nick

+0

這是重命名功能添加了什麼。我已經看到了一個包含四個不同版本的Xerces的jar,您可以在運行時選擇它。 :-P –

1

由於薩滿說是IMPOSIBLE來解決此問題的另一個容器。

讓我們看看:servlet容器JRE只有一個類加載器,這個類加載器可以從jaxb或其他類加載和使用一個類,但不能同時給你一個classdefnotfound異常或類似的東西。

你不能直接解決這個問題: 你可以得到代碼(是開源的)並將一個包改爲另一個名稱,這樣類加載器就可以同時使用這兩個包。我不建議你這個解決方案,是一個不好的解決方案。

更好的是,你遷移到使用最現代化的API代碼(JAXB 2)

+0

不能這樣做。因爲沒有所有的來源。有沒有辦法自己加載新的類?例如,我把所有的邏輯和依賴關係放到一個jar中,並加載它的主類。然後我稱之爲商業方法。如果我這樣做會怎樣? – Nick

相關問題