2011-11-06 56 views
2

由於項目要求,我需要創建一個Web應用程序,當執行時,將允許一些用戶上傳的zip文件這是像小應用程序,並且將包含.class文件,資源(圖像,CSS,JS,...)甚至lib文件。該zip文件幾乎就像一個戰爭文件。定製的ClassLoader,JSP執行和內部Web應用程序的資源檢索

任何方式輕鬆編碼它? AFAIK我想我知道如何編寫自定義的ClassLoader來從zip文件(Java - Custom ClassLoader - trying to load a class using class file full path)中加載類,甚至在瀏覽器請求時編碼資源檢索,但不知道如何執行將位於zip文件內的JSP文件或將jar lib文件加載到zip文件中。

編輯:web應用程序必須管理加載的應用程序,有沒有辦法實現這個如下回答,因爲web應用所需要的「主人」的webapp住。此外,「主」web應用程序允許版本化。用戶將能夠上傳新版本並升級到新版本,甚至在新版本開始失敗時進行降級。

回答

1

有沒有簡單的方法來做到這一點。這是很多工作。 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容器並沒有真正公開該功能給你。也就是說,如果你想成爲網絡上的好公民,你就會這麼做。你總是可以不斷地把內容放在客戶的喉嚨裏,緩存和代理服務器都被詛咒了。

0

您可以在Web容器webapps目錄內手動創建類似WAR的結構,並在其中放置類,JAR和JSP。

由於熱重新部署在Web容器啓用它會自動指定一個單獨的類加載器,它發現這個新的Web應用程序。

在大多數情況下,Web容器考慮具有可以有效的web.xml文件是一個Web應用程序的WEB-INF子文件夾中的任何文件夾。您可以通過修改其上下文配置來限制對此新Web應用程序的訪問,如果是Tomcat,則可以在META-INF/context.xml中找到它。

控制熱重新部署,加載器等的政策依賴於Web容器的類型,但我希望你是不是比Tomcat的惡化可能處理這一切。

相關問題