在OSGI中的jetty中部署webapp

时间:2017-07-04 05:58:55

标签: osgi apache-felix equinox

我在发布这个问题之前已经搜索了很久,没有找到令人满意的答案,因为我想说我宁愿不使用框架来执行以下任务,我唯一的工具是Felix,Jetty和一个Webapp。

我有一个使用maven管理的webapp,我在OSGI环境之外的jetty中部署,但是现在我也想在OSGI中部署它,所以我正面对典型的OSGI问题和原则,这是我理解的如果我出错了,请告诉我:

  • 我可以留下maven“war”包装

  • 使用apache.felix maven-bundle-plugin我创建了OSGI MANIFEST

  • 在OSGI中,应该在任何“webapp bundle”之前启动jetty-bundle

  • webapp包将具有其WEB-INF /类,但是,为了真正的OSGI样式,它将不具有任何WEB-INF / lib,因为它将找到其作为OSGI的依赖项 捆绑其他地方

    我感谢你,如果你想添加元素,不幸的是我发现只有文章可以快速转换标准战争的捆绑,但我真的很有兴趣在OSGI原则方面工作,所以我更愿意遵守

1 个答案:

答案 0 :(得分:1)

首先,回答更高级别的OSGi问题:

  
      
  • 我可以离开maven" war"包装
  •   

是的,但这意味着您正在生成一个WAR文件,其中包含以下所有规则。因此,您可能会在某个时候与maven-war-plugin作战。

  
      
  • 使用apache.felix maven-bundle-plugin创建OSGI MANIFEST
  •   

我更喜欢使用bnd-maven-plugin,但两者都使用相同的库(bnd)。生成OSGi清单(而不是手工编写)是迈向成功的重要一步。

  
      
  • 在OSGI中,应该在任何" webapp包之前启动jetty-bundle"
  •   

在一个写得很好的OSGi系统中,应该绝对没有启动订购限制。在Jetty启动之前,您的Web应用程序将不可用,但首先启动哪个捆绑包无关紧要。

  

webapp包将具有其WEB-INF /类,但是,为了真正的OSGI样式,它将不具有任何WEB-INF / lib,因为它将在其他地方找到其依赖性作为OSGI包

这取决于你。显然,要保留有效的WAR文件,这些类必须位于WEB-INF / classes中。 OSGi可以应对这种情况(尽管您需要设置Bundle-Classpath),但这不是必需的。如果你想把它们放在/中,那就继续吧。 OSGi也支持嵌入式JAR,但不是必需的。使用/作为类路径并使用Import-Package引用库是OSGi更惯用的用法。

OSGi中的Servlet

有一个支持Web应用程序的OSGi规范。它被称为Web应用程序规范,它是OSGi概要规范的第128章。这是您可以从OSGi容器中发布servlet的方法之一。但是,还有其他方法可以在OSGi中使用Servlet。

如果您只想使用WAR文件执行所有操作,请跳过,因为我将告诉您一个替代方案,您可能会发现更容易/更好。

如何在OSGi中部署Servlet

在OSGi中部署servlet的最佳和最简单的方法是使用Http Whiteboard(OSGi概要第140章)。注册servlet非常简单,只需将其作为OSGi服务发布,并将其与应匹配的模式一起发布。例如,使用声明性服务时:

@Component(property="osgi.http.whiteboard.servlet.pattern=/foo")
public class MyServlet extends HttpServlet implements Servlet {
    ...
}

您还可以注册过滤器,听众和各种其他内容。使用这样的声明式服务可以很容易地通过注入它们提供的服务与其他OSGi包进行交互。

Apache Felix Http Service是一个很好的,易于使用的基于Jetty的规范实现。

如何部署Web应用程序包

如果您真的想要部署为Web应用程序包,那么有几点需要注意。

根据原始提交者的请求进行编辑

  1. 所有servlet的生命周期与bundle的生命周期完全相同,因此很难正确使用OSGi服务。在Web应用程序包内部,如果servlet依赖的服务丢失或变得不可用,则无法限制servlet的可见性。这可能会导致您依赖捆绑启动订单,这很糟糕!
  2. 您必须在OSGi清单中设置额外的元数据,以确保OSGi可以处理WAR布局,并识别您的包以进行处理。
    • Bundle-ClassPath:WEB-INF / classes [,WEB-INF / lib / foo.jar]
    • Web-ContextPath:
  3. Jetty不是(据我所知)OSGi Web应用程序规范的实现。您将需要一个实现(可以在Jetty上运行),例如PAX-Web。
  4. OSGi Web应用程序规范仅定义了对Servlet 2.5的支持(更高的是实现值添加)。
  5. 许多人将Web应用程序包视为迁移路径,而不是最终目标。有一个特殊的内部布局(WEB-INF/classes),通常跟随"胖罐"模型意味着Web应用程序包通常具有有限的模块性,并且很难与其他工具一起使用。此外,它们无法与OSGi服务进行良好的交互(参见第1点),这使得它们比更多模块化模式(如OSGi Http Service Whiteboard)更难编写/维护。这意味着一些(包括我自己)将Web应用程序包视为"第一步"在迁移到OSGi时,最终使用Http服务白板。
  6. 根据maven构建的设置方式,您可能会发现有必要对bnd使用-wab指令。这样就可以将您的课程设置为WEB-INF/classes并设置Bundle-ClassPath