我将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。我怎么能做到这一点?
答案 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) {
...
}
}