2011-12-20 9 views
1

我的程序中一直處於相當尷尬的境地。 的情況是......我的項目是有在classpath中一些a.jar文件的文件,該文件包了許多重要的實用classes..but這A.jar很舊文件,我們不能代替這個,因爲我們不知道如何和它擁有什麼重要性.... 現在,我需要的方法從ServletResponse的I/F request.setCharacterencoding() & response.setCharacterEncoding但這A.jar包含舊版本的ServletResponse並且由於它我沒有得到上面的兩種方法。現在我已經在classpath中引入了新的servlet-api.jar但我的項目仍然參考servletRespons e類的A.jar而不是新的servlet-api.jar從特定jar文件中引用一個類

你們可以,請給我建議的方式從servlet-api.jar而不是a.jar文件

(PS:我不能刪除/修改a.jar文件)獲得新servletResponse參考

謝謝...

+0

您可以使用自定義類加載器並使用該加載器從servlet-api加載類,然後從該類加載器中獲取該類。不過,這可能很難做到。如果您運行在應用程序服務器上(例如JBoss,Websphere,Glassfish等),您可以查看其類加載策略如何在那裏支持您。 – Thomas 2011-12-20 08:07:52

+0

此問題可能會幫助你:http://stackoverflow.com/q/252893/644766 – melihcelik 2011-12-20 08:11:04

+0

或這一個:http://stackoverflow.com/q/60764/644766 – melihcelik 2011-12-20 08:11:11

回答

4

當你運行jar文件,使類路徑中選擇你想裝罐子的順序。如果您需要精確的語法,請告訴我,但一般情況下,如果您有CLASSPATH = patch16.jar:patch15.jar:patch14.jar:... etc,它將加載該類的第一個匹配副本,從patch16開始隨後的.jar等patch15.jar

的確切語法更多信息: http://javarevisited.blogspot.com/2011/01/how-classpath-work-in-java.html

+2

-1這不回答這個問題:重新安排類路徑沒有幫助,因爲存在交叉依賴關係 – 2011-12-20 08:13:58

+0

然後,您必須重新編譯代碼。 (或者確保在新jar中覆蓋所有舊類,以避免任何依賴性問題)。 此外,可以在啓動腳本中設置類路徑以保持可移植性。 – LazyCubicleMonkey 2011-12-20 08:21:14

+0

你嚴重缺少這一點。設置類路徑可以*永遠不會*解決這個問題,因爲他希望從A.jar和B.jar獲得的兩個jar的通用類。邏輯告訴你,不管你如何設置類路徑,你永遠不能滿足這個要求。你實際上不必重新編譯(java鏈接動態...這就是爲什麼他*有*這個問題),但你必須提供一個自定義類加載器 - 這將涉及重新編譯,但只有自定義類加載器。 – 2011-12-21 13:04:12

0

簡單的解決方案,如果這兩個ServletRqquest在不同的包,只是不導入傳統之一,但全包訪問它名稱。 或者您必須編寫自己的類加載來加載該jar。

0

我看到的唯一方法是獲取或創建一個ClassLoader,然後讓你的類的字節數組的內容,然後加載類。

0

沒有做什麼特別的東西,你會擰:類加載順序它們在類路徑中找到。

但是,您可以編寫自定義ClassLoader,可以採取專項行動對你所需要的課程,特別是在這種情況下加載從servlet-api.jarServletResponse,否則其在classpath A.jarservlet-api.jar

附:找出誰創建了一個與ServletRequest具有相同包名和名稱的類並殺死它們。

1

有你的classpath a.jar文件之前的servlet-api.jar中來。

然而,你的問題都沒有解決所有!如果預期舊的Servlet API實現,但是新的已加載,那麼A.jar中的某些內容會做什麼?或者當別人沒有相同順序的類路徑時會發生什麼?

你可能會更好解壓a.jar文件,並重新包裝爲A-modified.jar

+0

謝謝Flwyd,但正如我前面提到的..我不能修改A.jar – Rogger296 2011-12-20 08:39:22

1

其實JVM查找類依次嘗試從資源從列表中加載它們。例如,如果您的類路徑看起來像new.jar;old.jar,並且兩個罐子具有相同類別的不同版本,則將使用new.jar的版本。

請注意,如果您使用的是Unix,請使用:而不是;

但是,我可否表達我的疑問。你的項目有些東西聽起來不對。你爲什麼在你的自定義jar中有ServletRequest?我應該使用標準j2ee.jar或類似的東西來獲得這種標準類。據我所知,在過去的12年中,只有1個方法從servlet API中被刪除:實現servlet到servlet通信的能力。這發生在大約10年前。所以如果你使用的是最新版本的標準servlet API,那麼包括舊代碼在內的所有東西都應該可以工作

+0

嗨Alex,由於該項目是相當古老,它包含許多其他小模塊,因此可能是爲了這個目的,他們已經創造了這個A. (還是我不確定) – Rogger296 2011-12-20 08:43:09

+0

謝謝大家的快速建議.. 最後,我通過將servlet-api.jar放在classpath中,然後將其他文件放入其中... – Rogger296 2011-12-20 15:07:18

相關問題