Java Web应用程序“插件”架构

请提供有关如何为Java Web应用程序执行“插件”体系结构的建议。

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

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

请排除OSGi,Portlet等重要选项。

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

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

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

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

OSGi的

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

在此处输入图像描述

一些示例扩展Apache Felix Web控制台

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

您还可以查看eie-manager ,它简洁明了,并使用OSGi来管理插件。 可能是一个很好的例子。

自定义插件框架

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

在此处输入图像描述

还请检查Hudson插件架构

简单解决方案

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

优点:

  • 简单而小巧
  • 干净的概念
  • 效果很好

缺点:

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

我建议只使用JSPF,如果你真的需要一些简单性并想控制一切。 JPF提供了许多开箱即用的有趣function,例如:

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

问题是JPF已经死了。

建议

花点时间在Apache Felix上 。 它足够成熟,所以你的时间投资可能会收回很多。

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

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

开源Java Plug-in Framework项目支持插件停用,即使它太重,您也可以从中受到启发。

Atlassian 在这里开源他们的插件系统。 我看到Atlassian团队正在努力工作。 值得探索其文档