使用Jetty启动多个servlet

时间:2013-06-19 14:12:34

标签: java maven servlets jetty osgi

我将OSGi的Felix实现与Maven一起使用。我使用maven bundle插件连接依赖项(即Service-Component标头)。我使用以下命令注册一个servlet

<Service-Component>
 com.mycompany.MyServlet;
 provide:=javax.servlet.http.HttpServlet;immediate:=true;
 http=org.osgi.service.http.HttpService
</Service-Component>

但是,我想使用相同的HTTP服务运行第二个servlet。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:2)

我建议将felic SCR annotations与maven-scr-plugin一起使用

然后你可以简单地注释你的serlvets:

@Component(immediate=true)
@Service(Servlet.class)
@Property(name="alias", value="/path1")
public class Servlet1 extends HttpServlet {
    ...
}

@Component(immediate=true)
@Service(Servlet.class)
@Property(name="alias", value="/path2")
public class Servlet2 extends HttpServlet {
    ...
}

它还假设您已安装Felix HTTP whiteboard捆绑包。 HTTP白板将检测javax.servlet.Servlet类型的所有服务,并自动将它们注册到HTTP服务。

答案 1 :(得分:1)

快速回答:简单,在Service-Component标题中添加更多子句:

 <Service-Component>
  com.mycompany.MyServlet1;
    provide:=javax.servlet.http.HttpServlet;immediate:=true;
    http=org.osgi.service.http.HttpService,
  com.mycompany.MyServlet2;
    provide:=javax.servlet.http.HttpServlet;immediate:=true;
    http=org.osgi.service.http.HttpService
 </Service-Component>

更好的回答。 Apache Felix拥有白板捆绑。该捆绑包跟踪服务注册表中的Servlet服务(不是HttpServlet!但它确实跟踪过滤器服务),并自动将它们添加到当前的Http服务服务中。所以你要做的就是在Servlet.class下注册别名的'alias'属性。这也不需要你立即使用,直到使用servlet为止。在42的回答中提出了这一点,但是使用标题方法看起来像这样:

 <Service-Component>
  com.mycompany.MyServlet1;
    provide:=javax.servlet.servlet.Servlet; 
    properties="alias=/path"
 </Service-Component>

最佳答案,使用OSGi DS注释注册您的servlet:

 @Component(provide=Servlet.class, properties='alias=/path')
 public void MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest rq, HttpServletResponse rsp) {
        ...
    }
 }