簡體   English   中英

使用插件擴展Java Web應用程序

[英]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。

我認為,優勢有兩方面:

  • 您可以在兩次戰爭之間獲得一個漂亮,干凈,可調試的API,即Soap / XML消息
  • 您無需對整個應用程序進行回歸測試即可升級單個插件

缺點是您必須設置一些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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM