如何在 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
它是如何工作的。 @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)