我的这个 Web 应用程序已经变得一团糟,难以管理。

我想将其分成一个通用的“框架”部分(仍然包括页面和图像等网络内容)和几个添加额外功能和屏幕的模块。我希望这种重构也可以作为第三方扩展的插件系统。

所有模块都需要是单独的部署单元,最好是 war 或 jar 文件。

我尝试只制作几个常规的 war 文件,但 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应用程序之间实现互操作性

修改 我忘了提到Portlets几乎与框架无关 - 所以你可以将Spring用作父应用程序,个别开发人员可以在他们的Portlet上使用他们想要的任何东西。

您是否考虑过使用maven来分离您的项目,然后让它解决WAR和JAR之间的依赖关系?你最终会在WAR之间重复库,但只限于必要的地方(这不应该是一个问题,除非你进入一些时髦的类加载器乐趣)。

如果您需要以相对透明的方式从一个WAR到另一个WAR,Tomcat还允许您配置交叉上下文应用程序......

如果你想把东西保存在同一个网络应用程序(比如ROOT)下,你可以创建一个代理网络应用程序,转发到幕后的相关其他网络应用程序,以便用户使其相对透明?

您的主要问题是围绕系统的物理静态资产 - 其余的只是简单,有效,罐子。

WAR在Tomcat中与单独的类加载器分开,但它们在会话级别分开(每个WAR都是一个独立的Web应用程序,并且具有自己的会话状态)。

在Glassfish中,如果WAR捆绑在EAR中,它们将共享类加载器(GF在EAR中使用平面类加载器空间),但仍然具有单独的会话状态。

另外,我不确定你是否可以做一个“前进”的到服务器中的另一个WAR。问题在于,转发使用Web应用程序根目录的相对URL,并且每个WebApp都有自己的根,因此您只是“无法从此处到达”。你可以重定向,但这与前锋不同。

因此,Web App的这些功能与您试图在容器内均匀部署它们相抵触。

相反,我认为热门提示是创建一个“汇编程序”。获取单个模块并“合并”的实用程序他们进入一个Web应用程序。它可以合并他们的web.xml,他们的内容,规范化罐子和类等等。

WAR是Java世界中的一个功能和错误。我喜欢他们,因为他们确实在部署已编译的应用程序“拖放”。在安装它们方面,这个功能的使用远远超过你所遇到的功能。但我感觉到你的痛苦。我们有一个共同的“核心”我们在应用程序之间共享的框架,我们基本上必须不断合并以维护它。我们编写了它的脚本,但它仍然有点痛苦。

“另外,我不确定你是否可以做”转发“到服务器中的另一个WAR。问题在于,转发使用Web应用程序根目录的相对URL,并且每个WebApp都有自己的根,因此您只是“无法从此处到达”。你可以重定向,但这与前锋不同。“

只要该WAR允许某人执行此操作,您就可以转发到另一个WAR。

玻璃鱼和EAR的多个WAR:这是有道理的。

如果将MAIN类放在tomcat的共享CLASSPATH中,那么可以将各个PLUGIN放在单独的WAR文件中。

Main应用程序也可以是您在server.xml中定义的TOMCAT servlet的一部分。这可以是MASTER SERVLET,所有其他WAR都可以由此主servlet控制。

这有意义吗?

BR,结果 〜A

根据插件功能的复杂性,我还会考虑使用 Web 服务,例如使用 Axis 实现。

然后,您的主应用程序将使用提供该服务的 Web 应用程序(插件)的 URL 进行配置。

在我看来,优点是双重的:

  • 在这两场战争之间,你会得到一个漂亮、简洁、可调试的应用程序接口,即 Soap/XML 信息
  • 您可以升级单个插件,而无需对您的 整个应用

缺点是您必须建立一些 Axis 项目,而且您必须有一些 类插件配置。此外,您可能需要限制对服务网络的访问。 因此可能需要进行一些配置。

如果插件在同一数据库中工作,请务必限制缓存时间或配置战争跨度。 缓存层。

我也在尝试开发一个通用或抽象的框架,我可以在运行时添加插件(或模块)并增强现有的运行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插件并将文件复制到正确的目录。

如果您考虑将应用程序拆分为单独的模块,那么实际上没有比OSGI更好的了。看看Greenpages的例子。您可以创建一个父模块(核心),其中包含应用程序所需的jar。

如果您对组件编程有所了解,您很快就会发现OSGI模块的行为类似于接口,您必须在其中公开您将在其他模块中使用的内容。一旦你理解,这很简单。无论如何,当你学习如何使用OSGI时,它也会非常痛苦。我们在使用JSON时遇到了问题,我们作为jar添加到模块中的Jackson版本被Spring核心模块中包含的其他jar覆盖。您必须仔细检查为您的需求加载了哪个版本的jar。

不幸的是,即使是OSGI方法也无法解决我们正在寻找的问题。如何在运行时扩展持久模型和现有表单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top