有沒有簡單的方法來做到這一點。這是很多工作。 Classloaders是非常挑剔的野獸。可以說,創建類似Tomcat的大部分工作是爭奪類加載器,其餘部分僅僅是配置。即使這些年過去了,我們仍然有問題。例如,Tomcat在嘗試卸載現有的webapps,使用Java類庫的內部信息來嘗試尋找類加載器泄漏的地方等方面非常積極,儘管他們付出了努力,但仍存在問題。
最新版本的Glassfish具有(或將具有)版本應用程序部署的功能。你可能只需要在Tomcat的內部路由和映射代碼上管理版本就可以了。
如果您運行的是EJB容器,您可以將核心服務放入EJB中並讓WAR與它們交談(您可以使用通用servlet容器中的Web服務執行此操作,但許多EJB容器可以將Remote語義轉換爲調用同一個容器的本地語義)。
你也可以看看OSGI。這是另一個真正需要管理的痛苦,但它可能具有足夠的粒度,甚至可以爲您提供版本控制,但您的用戶都不想使用它。我提到這是一個真正的痛苦管理?我們這樣做是爲了動態加載Web內容和邏輯,但我們不會對此進行版本管理。
如果你必須在一個WAR的控制一切,那麼你最好的選擇是押注的Java,而是使用腳本語言。您傾向於更多地控制腳本環境的運行時,特別是如果您不讓它們訪問任意Java類。
有了這個,你可以上傳你想要的任何有效載荷,處理所有的派遣自己的靜態資源和邏輯(這意味着你得處理版本方面)。爲你的「JSP」頁面使用類似Velocity的東西,然後使用Javascript或其他任何邏輯。
版本化的環境可能會很痛苦。如果你不在乎以原子方式做它,那顯然更容易。如果您能夠承受「停機時間」(使v1離線,然後調出v2),那就容易多了。如果你正在上傳每個版本的全部內容,那真的很簡單。我的系統允許增量更改,並且具有寫入時複製語義,所以它更難。但我並不是真的想爲每個版本上傳幾個Gb的媒體。
基本的問題是,在使用類加載器時,會出現龍 - 這些東西並不容易,而且有替代方法可以實際將代碼投入生產,而不是創建疤痕和生氣。使用腳本語言可以極大地簡化。其餘的都是派遣,可以通過過濾器或servlet來完成。
你會得到重新實現HTTP協議這樣的固體塊的巨大喜悅,這總是一種享受,以及因爲servlet容器並沒有真正公開該功能給你。也就是說,如果你想成爲網絡上的好公民,你就會這麼做。你總是可以不斷地把內容放在客戶的喉嚨裏,緩存和代理服務器都被詛咒了。