English 中文(简体)
OSGi环境喷气中的注册服务器(装货量问题)
原标题:Registering servlet in Jetty in OSGi environment (Class loading problems)

我有OSGi应用程序 内嵌的Jetty 8.1.1服务器。

当我以单项( no OSGi environment) 运行我的应用程序时, 我可以成功注册 servlets, 调用 org. eclipse.jetty. servlet. servletContextHandler. addservlet (String className, String 映射) 方法。 所以我现在尝试在 OSGi 环境中也这样做 。

目标是写一个捆绑(servlet-extender ),该捆绑将登记其他捆绑启动时由其他捆绑提供的服务器(extender模式) 。 因此,在我的应用程序启动后,只有两个基本捆绑在运行中: jety servlet-extender

<强度> 1 尝试写入 < code> servlet- extender :

首先,我决定在提供服务器的捆包的 MANIFEST.MF 档案中宣布使用其映射图的服务器。如果开始使用这种捆包,那么, servlet-externder 搜索其 MANIFEST.MF 的服务器映射声明。如果找到任何服务器映射声明,则使用所谓的 servlet-exterder 来实际登记服务器。add Servlet(...) 方法来实际登记服务器。

虽然这个想法似乎可以, 但班级加载有问题。 事实上, Jetty 调用 classs.forName ("org.my.servlets.MyServletClass"). newInstance () 。 虽然 jety bagn不导入 org.my.servlets 包, 但调用 > class > class.forName ("org.my. servlets.MyServletClass") 的调用 > class nonFoundexeption 失败了。

2nt 试图写入 servlet-extender :

我在 OSGi 中搜索了与班级装货有关的一些文章 。 < a href="http://njbart.name/2010/08/30/osgi-reading-loading- classes.html" rel=“nofollow” >这个 < a>给我一个希望,希望我可以通过一些 OSGi 服务提供上载的服务器类。 因此我创建了 Servlet provid 服务 。 扩展 Servlet>, String> get Servlet> () < servilling > () < servilling > server > class.

我理解,如果 jetty balln将导入 org.my.servlets 软件包,这可以解决。 但是,当第3方提供 jetty 软件包时,这是不可能的,我不能修改它的 import-Package 声明。

如何动态登记任意捆绑提供的服务器? < 坚固>

P.S.:我不能使用“OSGi Http Service”,因为我必须使用Jetty s 8.1.1 WebSocketServlet。

最佳回答

问:我仍对通过服务站类名称来公开注册服务站的方式感到好奇。

A:是:)

First possible solution: if you are allowed to modify the jetty manifest, you could add "DynamicImport-Package: *" to the manifest, this will allow it to load any classes while at the same time it won t be depending on custom org.my.servlets packages. Of course, note that this is bad practice in general for OSGi.

Second possible solution: jetty remains like it is. Servlet bundles list containing servlets declaratively in the manifest, as in your first attempt. The key here is the servlet extender. It will create the servlet and register it in jetty. The important thing about this whole classloading problem is that the creation of the servlet object has to be done somewhere where the classloader (in this case the classloader of the servlet extender) has access to the classes of the servlets. This cannot happen in jetty, because you cannot modify the MF. However, you have full control over the MF of servlet extender, right?

您既可以导入 org.my.spresslets (不推荐,因为无法预见今后将安装什么服务器);

在MF中使用“动态进口-包件:*” (一般不建议的做法;)

或 (建议) 扩展者使用 servlet jar 的类载器从 servlet 罐上装载班级 -- -- 使用 < 坚固> Bundle loadClass () 方法(见 < a href="http://dz. prosyst.com/pdoc/mBS_SDK/um/runtime/osgi/docs/framework/api/framework/index.html" rel= "nofollow" > org.osgi.framework.Bundle )。 这将正确装载班级。 请注意, 这可能会受到安全限制 。

问题回答

您不必自己做这件事。 已经有一个 pax-web 提供此功能 。 见 < a href=" http://team.ops4j.org/ wiki/ display/ paxweb/ Pax+Web" rel = "nofollow" > http://team. ops4j. org/ wiki/ display/paxweb/ Pax+Web

Apache Karaf也有和平网。您可以在那里安装一个功能:安装 http-whiteboard 。

如果您想自己做, 您可以查看 Pax 网络的代码。 概念是简单的将您服务器注册为 OSGi 服务。 您可以使用服务属性来提供像 http 路径这样的注册参数 。

我最近注意到Jetty s 8.1.1 ServletContextHandler 有一种方法 addsservlet(ServletHolder, String) 。 我对上述 " code>Servlet-externder 进行了修改,因此现在它以下列方式登记了服务器:

 public void servletProviderRegistered(ServletProvider servletProvider) {
     Map<? extends HttpServlet, String> servlets = servletProvider.getServlets();
     for (Entry<? extends HttpServlet, String> entry : servlets.entrySet()) {
         HttpServlet servletInstance = entry.getKey();
         String mapping mapping = entry.getValue();
         ServletHolder servletHolder = new ServletHolder(servletInstance);
         servletContextHandler.addServlet(servletHolder, mapping);
     }
 }

使用此方法, Jetty 不需要调用 classs.forName ("org.my.servlets.My ServletClasss")。 NewInstance () 所以现在我找不到Class notFoundExpendion

由于这是解决我问题的办法<强者>,我仍对通过Servlet类名称来公开登记服务站的方式感到好奇。 <强者>是否有可能?





相关问题
Can t access locally hosted project via the internet?

I m currently developing a Java Servlet Project in Eclipse. The project is compiled via Tomcat 5.5 and hosted in localhost:8080(alternatively 127.0.0.1:8080 AND 192.168.1.10:8080 which also happens ...

JSP programmatically render

I need to programmatically render JSP page. As far as I understand, JSP should have some compiler. The question is can I use this compiler dirrectly without JspServlet and others? All I need is ...

Javascript redirect

I am working with javascript and here is what I am trying to do: 1. Send a get request which looks like "http://localhost:8080/myapp/verify.htm?verifyId=Agkvhs" My requests reaches my verify.jsp in ...

热门标签