17

请提供有关如何为 Java Web 应用程序做“插件”架构的建议。

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

我需要类似Redmine的东西。可以启用/禁用任何模块的地方,更新 红米用户界面

请排除 OSGi、Portlet 等繁重的选项。

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

3 回答 3

16

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

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

资源是WEB应用的主要问题

操作系统

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的插件抽象层。

优点:

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

缺点:

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

我建议仅当您确实需要一些简单性并想要控制一切时才使用JSPF 。JPF提供了许多开箱即用的有趣功能,例如:

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

问题是 JPF 已经死了。

建议

一定要花一些时间在Apache Felix上。它已经足够成熟,因此您的时间投资可能会得到很多回报。

于 2013-02-20T15:49:14.913 回答
6

查看这个问题的答案:Best way to build a Plugin system with Java

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

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

于 2013-01-16T12:47:55.403 回答
2

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

于 2014-01-06T18:50:01.823 回答