Jetty:从另一个jar加载一个上下文

时间:2014-10-17 16:38:36

标签: java maven jetty spi

我已经构建了一个通过SPI加载多个插件的应用程序。每个插件都必须实现FrameworkPlugin接口。

public interface FrameworkPlugin {
    ...
    ContextHandler getWebContent();
    String getPluginID();
    ...

}

示例实现是

...
ContextHandler getWebContent() {
   WebAppContext wac=new WebAppContext();
   wac.setBaseResource(new ResourceCollection(new String[] {"./src/main/webapp"}));
   return wac;
}
...

Main-Project运行一个Jetty实例,所有插件都应该使用它来提供基于Web的服务。插件必须能够在其自己的上下文中配置它的个别环境,除了由主项目管理的基本URL。

...
for (FrameworkPlugin p : PLUGINS) {
    ContextHandler h= p.getWebContent();
    h.setContextPath("/plugin/"+p.getPluginID().toString());
    collection.addHandler(h);
}
jettyInstance.setHandler(collection);
...

因此理论上,插件应该可以在/plugin/<id>下访问。不幸的是,Jetty抛出了IllegalArgumentException,因为插件将./src/main/webapp设置为资源库,而在主项目中不存在。

那么如何通过插件接口提供上下文处理程序?

部署WAR不是一种选择,因为加载机制无法更改。一切都必须使用插件界面完成。

1 个答案:

答案 0 :(得分:1)

如果这不是基于WAR的项目,那么完全跳过WebAppContext的使用,只需在Jetty本身使用Handler系统。

WebAppContext是一个专门的Handler,用于跟随servlet规范的完整的Web应用程序。它规定了servlet规范要求的行为,从世俗(url映射顺序行为),经过黑色艺术(每个元素描述符顺序查找和覆盖)到复杂(webapp类加载器隔离)。

Jetty中的Handler系统可以是1..n Handlers,在树中(通过HandlerCollections),有时使用Contextmutable Handler collections,并且所有都存在于与服务器相同的类加载器中(如果需要)。随意使用正则表达式或您自己的level 3 URI templates实现来制作地图。完全取决于你想要用它做什么。你有许多预先构建的处理程序和基本处理程序来构建。

您将still have access加上标准HttpServletRequestHttpServletResponse,以及这些提供的异步处理和I / O.但您也可以访问原始内部Request对象,该对象在HttpServletRequest上提供更多功能。

顺便说一句,许多基于servlet的应用程序现在都支持插件。大多数人使用Controller Servlets或过滤器或ServletContext注册的操作来实现这一点。