[英]Extending Java Web Applications with plugins
我有這個Web應用程序已經發展到一個難以管理的混亂。
我想將它拆分為一個通用的“框架”部分(仍包括網頁內容,如頁面和圖像)和幾個增加額外功能和屏幕的模塊。 我希望這種重構也可用作第三方擴展的插件系統。
所有模塊都需要是獨立的部署單元,理想情況下是war或jar文件。
我試圖制作幾個常規戰爭文件,但是Tomcat保持(根據servlet規范)這些war文件完全彼此分開,因此他們不能共享他們的類,例如。
我需要插件才能看到“主”類路徑。
我需要主應用程序來控制插件,例如能夠列出它們,並設置它們的配置。
我想保持插件本身之間的完全分離(除非它們指定依賴項)和可能在同一個Tomcat上運行的任何其他不相關的Web應用程序。
我希望它們根植於“主”應用程序URL前綴,但這不是必需的。
我想使用Tomcat(大型架構更改需要與太多人協調),還要聽到EJB或OSGi世界中的干凈解決方案(如果有)。
我一直在修補使用OSGi來解決你所描述的同樣問題的想法。 特別是我正在考慮使用Spring Dynamic Modules 。
看一下Java Portlets - http://developers.sun.com/portalserver/reference/techart/jsr168/ - 簡而言之,該規范允許在其他自包含的j2ee Web應用程序之間實現互操作性
編輯我忘了提到Portlet幾乎與框架無關 - 所以你可以將Spring用於父應用程序,個別開發人員可以在他們的Portlet上使用他們想要的任何東西。
你有沒有看過使用maven來分離你的項目然后讓它解決WAR和JAR之間的依賴關系? 你最終會在WAR之間重復庫,但只限於必要的地方(這應該不是問題,除非你進入一些時髦的類加載器樂趣)。
如果您需要以相對透明的方式從一個WAR到另一個WAR,Tomcat還允許您配置交叉上下文應用程序...
如果你想把東西保存在同一個網絡應用程序(比如ROOT)下,你可以創建一個代理webapp,在幕后轉發到相關的其他webapp,讓用戶相對透明?
您的主要問題是圍繞系統的物理靜態資產 - 其余的只是簡單,有效,罐子。
在Tomcat中,WAR與單獨的類加載器分離,但它們在會話級別是分開的(每個WAR都是一個獨立的Web應用程序,並且具有自己的會話狀態)。
在Glassfish中,如果WAR捆綁在EAR中,它們將共享類加載器(GF在EAR中使用平面類加載器空間),但仍然具有單獨的會話狀態。
另外,我不確定你是否可以向服務器中的另一個WAR“前進”。 問題在於轉發使用Web應用程序根目錄的相對URL,並且每個WebApp都有自己的根,因此您只是“無法從此處到達”。 你可以重定向,但這與前鋒不同。
因此,Web App的這些功能與您試圖在容器內均勻部署它們相抵觸。
相反,我認為熱門提示是創建一個“匯編程序”實用程序,它將您的各個模塊“合並”到一個Web應用程序中。 它可以合並他們的web.xml,他們的內容,規范化罐子和類等。
WAR是Java世界中的一個特性和錯誤。 我喜歡他們,因為他們確實在安裝它們時使部署編譯的應用程序“拖放”,而且這個功能的使用遠遠超過你遇到的功能。 但我感覺到你的痛苦。 我們在應用程序中共享一個共同的“核心”框架,我們基本上必須不斷合並以維護它。 我們編寫了它的腳本,但它仍然有點痛苦。
“另外,我不確定你是否可以向服務器中的另一個WAR”前進“。問題是前鋒使用相對URL到Web App的根目錄,每個WebApp都有自己的root,所以你只是“無法從這里到達那里”。你可以重定向,但這與前鋒不同。“
只要該WAR允許某人執行此操作,您就可以轉發到另一個WAR。
玻璃魚和EAR的多個WAR:這是有道理的。
如果將MAIN類放在tomcat的共享CLASSPATH中,那么可以將各個PLUGIN放在單獨的WAR文件中。
Main應用程序也可以是您在server.xml中定義的TOMCAT servlet的一部分。 這可以是MASTER SERVLET,所有其他WAR可以由此主servlet控制。
那有意義嗎 ?
BR,
〜一
如果您正在考慮將應用程序拆分為單獨的模塊,那么實際上沒有比OSGI更好的了。 看看Greenpages的例子。 您可以創建一個父模塊(核心),其中包含應用程序所需的jar。
如果您對組件編程有所了解,您很快就會發現OSGI模塊的行為類似於接口,您必須在其中公開您將在其他模塊中使用的內容。 一旦你理解,這很簡單。 無論如何,當你學習如何使用OSGI時,它也會非常痛苦。 我們在使用JSON時遇到了問題,我們作為jar添加到模塊中的Jackson版本被Spring核心模塊中包含的其他jar覆蓋。 您必須仔細檢查為您的需求加載了哪個版本的jar。
不幸的是,即使OSGI方法也無法解決我們正在尋找的問題。 如何在運行時擴展持久模型和現有表單。
根據插件功能的復雜性,我也會考慮使用Web服務,例如使用Axis實現。
然后,您的主應用程序將配置提供服務的Web應用程序(插件)的URL。
我認為,優勢有兩方面:
缺點是您必須設置一些Axis項目,並且您必須具有某種插件配置。 此外,您可能需要限制對服務Web應用程序的訪問,因此可能需要進行一些配置。
如果插件在同一個數據庫上工作,請確保限制緩存時間或配置war-spanning緩存層。
我也一直在嘗試開發一個通用或抽象的框架,我可以在運行時添加插件(或模塊)並增強現有的運行webapp。
現在,正如您所說,使用WAR或JAR文件的首選方式。 WAR文件的問題是,您無法將插件部署到現有應用程序。 Tomcat將其部署為單獨的Web上下文。 不可取。
另一個選項是JAR文件並編寫一些自定義代碼將該JAR文件復制到WEB-INF / lib文件夾並將類加載到現有的類加載器中。 問題是,如何部署JSP或配置文件等非java文件。 為此,有兩個解決方案,a。 使用velocity模板而不是JSP(b。)編寫一些自定義代碼來從類路徑而不是上下文路徑讀取JSP。
OSGI或Spring Dynamic模塊很不錯,但此時它們看起來過於復雜。 如果我感覺到它,我會再次研究它。
我正在尋找簡單的API,它可以處理插件的生命周期,並且仍然可以在我打包的JAR文件中使用JSP。
可能是,你可以在部署時使用un jar插件並將文件復制到正確的目錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.