我已经构建了一个通过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不是一种选择,因为加载机制无法更改。一切都必须使用插件界面完成。
答案 0 :(得分:1)
如果这不是基于WAR的项目,那么完全跳过WebAppContext
的使用,只需在Jetty本身使用Handler
系统。
WebAppContext
是一个专门的Handler
,用于跟随servlet规范的完整的Web应用程序。它规定了servlet规范要求的行为,从世俗(url映射顺序行为),经过黑色艺术(每个元素描述符顺序查找和覆盖)到复杂(webapp类加载器隔离)。
Jetty中的Handler
系统可以是1..n Handlers
,在树中(通过HandlerCollections),有时使用Context,mutable Handler collections,并且所有都存在于与服务器相同的类加载器中(如果需要)。随意使用正则表达式或您自己的level 3 URI templates实现来制作地图。完全取决于你想要用它做什么。你有许多预先构建的处理程序和基本处理程序来构建。
您将still have access加上标准HttpServletRequest
和HttpServletResponse
,以及这些提供的异步处理和I / O.但您也可以访问原始内部Request
对象,该对象在HttpServletRequest
上提供更多功能。
顺便说一句,许多基于servlet的应用程序现在都支持插件。大多数人使用Controller Servlets或过滤器或ServletContext注册的操作来实现这一点。