gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:25:03 24 4
gpt4 key购买 nike

我构建了一个通过 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作为资源库,主项目中不存在。

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

部署 WAR 不是一种选择,因为加载机制无法更改。一切都必须通过使用插件接口(interface)来完成。

最佳答案

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

WebAppContext 是一个专门的Handler,旨在与遵循 servlet 规范的成熟且完整的 Web 应用程序一起使用。它规定了 servlet 规范规定的行为,从平凡的(url 映射顺序的行为方式),到复杂的(每个元素描述符顺序查找和覆盖),再到复杂的(webapp 类加载器隔离)。

Handler Jetty 中的系统可以是 1..n Handlers,在树中(通过 HandlerCollections ),有时使用 Context , mutable Handler collections ,并且全部存在于与服务器相同的类加载器中(如果您愿意的话)。请随意使用正则表达式或您自己的 level 3 URI templates 实现 url 映射。完全取决于你想用它做什么。您有许多预构建的处理程序和基础处理程序可供构建。

你会still have access标准 HttpServletRequestHttpServletResponse,以及它们提供的异步处理和 I/O。但您还可以访问原始内部 Request对象,它比 HttpServletRequest 提供更多功能。

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

关于java - Jetty:从另一个 jar 加载上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26429608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com