Java Web 应用程序“插件”体系结构

请就如何为Java Web应用程序做“插件”架构给出建议。

目前,我们在Tomcat servlet容器中使用非常简单和标准的Spring + Hibernate + Struts 2。(用专家建造)

我需要像Redmine这样的东西。可以启用/禁用、更新任何模块的位置Redmine UI

请排除像OSGi,Portlet这样的重型选项。

  • OSGi太重了,没有很好地采用Web技术。我已经看过Eclipse Germini;
  • Portlet它只是旧的,从来没有流行过。

答案 1

我将尝试提供几种可能的解决方案。我确实花了一些时间为我正在从事的项目准备小型PoC,所以我们希望下面的选项是相关的。

重要提示:定义一些扩展点,进行解析并找到可用的实现非常容易。有很多可用的解决方案,例如好的和简单的解决方案 - JSPF

资源是 WEB 应用程序的主要问题

OSGi

OSGi,并不是那么糟糕,而且很有用。它似乎很重(有些实现很重),但这是标准化平台的代价。我建议检查Apache Felix。它可以在“轻量级”模式下使用。顺便说一句,它包括Web控制台,它是作为松散耦合的基于插件的应用程序构建的,可能会有所帮助:

enter image description here

扩展 Apache Felix Web Console 的一些示例

Web 控制台可以通过为接口 javax.servlet.Servlet 注册 OSGi 服务来扩展,并将服务属性 felix.webconsole.label 设置为页面的标签(URL 中的最后一段)。相应的服务称为 Web 控制台插件或简称插件。

您还可以检查eie管理器,它是否干净简单,并使用OSGi来管理插件。对你来说可能是一个很好的例子。

自定义插件框架

我建议回顾一下Jenkins/Hudson背后的解决方案。我会说Jenkins插件系统非常成熟和可靠。可以作为一个很好的例子。

enter image description here

另请查看 Hudson Plugin Architecture

简单的解决方案

对于我的项目,我已经使用自定义依赖关系解析器构建了基于JSPF的插件抽象层。

优点:

  • 简单而小巧
  • 清洁概念
  • 效果很好

缺点:

  • 没有适当的插件管理可能会很慢(完整的类路径搜索)
  • 提供非常基本的功能
  • 可能需要额外注意

我建议只有在您确实需要一些简单性并希望控制所有内容时才使用JSPFJPF提供了许多开箱即用的有趣功能,例如:

插件可以在应用程序执行期间“热注册”,甚至可以取消注册。此外,注册的插件可以“动态”激活和停用,从而最大限度地减少运行时资源使用。

问题是JPF已经死了。

建议

花一些时间与Apache Felix在一起。它足够成熟,所以你的时间投资可能会得到很多回报。


答案 2

查看这个问题的答案:使用Java构建插件系统的最佳方法

如果您不信任插件代码,则可以实现沙盒,如下所述:针对 Java 应用程序中的恶意代码进行沙盒处理

开源Java插件框架项目支持插件停用,即使它对于您的目的来说太重,您也可以从中获得灵感。


推荐