如何在 OSGi 中使用 servlet

Posted

技术标签:

【中文标题】如何在 OSGi 中使用 servlet【英文标题】:How to use servlet with OSGi 【发布时间】:2013-04-25 04:27:03 【问题描述】:

我想创建一个 Web 服务并将其部署到 OSGi 容器。比如发布服务到地址:

http://localhost:8080/testservice. 

服务在 servlet 中生成 html 响应。

我搜索了很多,得到了:

public class HelloWorldServlet extends HttpServlet 
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hola</title>");
    out.println("</head>");
    out.println("<body bgcolor=\"white\">");
    out.println("</body>");
    out.println("</html>");
  

我需要使用的工具:

    maven 创建项目

    将 ESB karaf 融合为 OSGi 容器

问题是我不知道如何使用 Maven 来创建和实现这样的 web 服务,比如:

如何指定webapp/web.xml

如何指定pom.xml:依赖、包类型、插件

如何注册服务:实现BundlActivator或配置Spring xml文件

谁能帮我解决这个问题?新手有详细教程吗?

【问题讨论】:

我的github.com/bdelacretaz/OSGi-for-mere-mortals 示例演示了一个简单但完整的基于 OSGi 的应用程序,它使用了一些 servlet。它不在其容器中使用 Apache Karaf,但应该可以帮助您大致了解其工作原理。 【参考方案1】:

检查一下,可能对你有帮助Create a servlet that accesses an OSGi service

【讨论】:

【参考方案2】:

如果您使用 bndtools,请创建一个声明式服务项目并将此注释添加到您的 servlet:

 @Component(provide = Servlet.class, properties = "alias=/hello")
 public class HelloWorldServlet extends HttpServlet  ... 

然后使用“带有 Web 控制台和 Gogo 的 Apache Felix 4”创建一个 bnd 运行描述符,只需添加 Apache Felix Http 白板包就可以了。您可以在 http://localhost:8080/hello

找到您的 servlet

它是如何工作的。 @Component 注释使您的类成为服务(由于提供属性,在这种情况下为 Servlet 服务)。这是使用服务属性“别名”注册的。 Apache Felix Http Whiteboard 包获取这些服务并将它们注册为 servlet。我认为没有比这更简单的了。

【讨论】:

@Compoment 够用吗?我一直认为 Servlet 也必须声明为 \@Service。 我需要使用 FUSE ESB Enterprise。无法切换到 Apache Felix。 Apache Felix 与 Apache Karaf 类似吗? @ilikeorangutans 是的,这就够了。注意“provide=Servlet.class”属性。 @Li' FUSE ESB 和 Karaf 都建立在 Apache Felix 之上。所以你根本不需要切换。无论如何,所有这些都适用于任何框架,例如 Equinox 和 Knopflerfish。欢迎来到 OSGi,我们非常重视可重用性和可移植性! FUSE ESB 和 Karaf 使用 Pax Web 作为 HTTPService 的底层实现,Peter 的回答对于 HTTPService 的这个实现也是正确的。虽然 Pax Web 确实为您提供了一些标准中没有的更多功能。 HTTP服务,例如WhiteBoard Extender 也可以用于过滤器、JSP 和其他资源。更不用说您能够部署 std.卡拉夫的战争。【参考方案3】:

您可能会发现以下教程很有帮助:http://www.javabeat.net/2011/11/writing-an-osgi-web-application/。它基于Enterprise OSGi in Action 的第二章。第八章还讨论了如何使用 maven 等构建工具来获得正确的包结构,http://coding.alasdair.info/2011/01/creating-web-application-bundle-using.html 也有非常有用的 maven 说明。

在高层次上,您的最佳途径可能是利用 Apache Aries 或 Eclipse Gemini 之类的工具来运行 WAB(Web 包)。 WAB 的结构几乎与 WAR 完全相同,只是清单中包含 OSGi 元数据。您的 servlet 类本身将与非 OSGi 案例相同。该框架将处理发现和启动您的 servlet。

【讨论】:

【参考方案4】:

要回答您的问题,因为 Karaf (FUSE ESB) 使用 Pax Web 作为其默认的 Web 容器,请查看 Pax Web 了解更多详细信息,并且可能最适合您在 100 多个 integration tests 的Pax Web 为您提供有关如何使用它的想法。还有samples 可向您展示如何使用任一标准。 Http-Service,通过 Whiteboard-Extender 或作为 WAR/WAB。

【讨论】:

【参考方案5】:

我猜您需要一个 servlet 桥接器才能访问该服务。你的服务应该被实现为一个 OSGI 包; servlet 桥必须具有嵌入式 OSGI 框架。关注此示例了解详情:http://vbashur.blogspot.kr/2014/07/osgi-servlet-bridge-sample.html

【讨论】:

【参考方案6】:

我想跟进Peter Kriens的回答。使用 OSGi 规范中可用的 @Component 注释,示例可能如下所示:

@Component(service = Servlet.class, property =  "osgi.http.whiteboard.servlet.pattern = /hello" )
public class HelloWorldServlet extends HttpServlet  ... 

@Component 注解是从org.osgi.service.component 导入的,并且指定已实现服务的属性已将其名称更改为service

尽管它的名字,property 可以包含多个属性,例如

@Component(service = ..., property =  "a=b", "c=d" )

或者您可以使用properties 指定一个或多个属性文件,如下所示:

@Component(service = ..., properties =  "OSGI-INF/servlet.properties"  )

以上内容已经使用 Apache Felix 附带的HttpService 进行了测试。 Apache Felix HTTP 服务的文档可以在这里找到:http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html

【讨论】:

以上是关于如何在 OSGi 中使用 servlet的主要内容,如果未能解决你的问题,请参考以下文章

GF4 javax.servlet.http.HttpServlet 的 OSGI 包 - ClassNotFound

如何在 Scala 的 Felix 中运行 OSGi 蓝图?

如何使用单独的类加载器并在同一个 JVM 中运行? (OSGI)

如何在java中使用来自另一个bundle的OSGI引用

在 Netbeans 和 Karaf 中开发 OSGI 包时如何管理依赖关系?

如何开始使用 OSGi