同时从两个目录提供 jetty webapp

发布于 2024-10-22 02:52:45 字数 587 浏览 1 评论 0原文

在开发中我使用jetty作为servlet容器。我有以下开发配置:

  • 主项目具有 wabapp 目录
  • 派生项目,该项目覆盖 webapp 目录中的一些文件

由于向 jetty 提供了适当的 WebAppContext,主项目 webapp 可以在开发模式下启动。

现在我想类似地启动派生项目,假设发出请求时,会尝试:

  • 从派生项目的 webapp 目录中获取资源(
  • 如果不存在),从主项目的 webapp 目录中获取资源

我知道这是可能的重写 WebAppContext#getResource() 方法,但是我们在项目中使用的一些库似乎自己对 wabapp 目录执行 IO 操作。例如,通过调用 ServletContext#getRealPath("/"),然后读取文件而不使用 ServletContext#getResource() 方法。这个问题可以通过 File 之上的一些虚拟文件系统在较低级别上解决,但是 JDK 1.6 似乎不支持它,有什么建议吗?

In development I use jetty as the servlet container. I have the following development configuration:

  • master project which has wabapp directory
  • derived project which overrides some of the files in webapp directory

The master project webapp can be started in development mode thanks to providing appropriate WebAppContext to jetty.

Now I want to start derived project analogously, assuming that when request is made, there is an attempt to:

  • get resource from webapp directory of derived project
  • if it does not exists, get it from webapp directory of master project

I know that it is possible to override WebAppContext#getResource() method, however some libraries we use in the project seem to perform IO operations on wabapp directory on their own. For example by calling ServletContext#getRealPath("/"), and then reading files without use of ServletContext#getResource() method. The problem could be solved on lower level by some virtual file system on top of File, however it does not seem to be supported in JDK 1.6, any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

山田美奈子 2024-10-29 02:52:45

似乎使用像 ResourceCollection 这样的东西就足够了:

http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/resource/ResourceCollection.html

不幸的是,GWT 的 DevMode我使用的是基于jetty 6,其中ResourceCollection不可用。我自己扩展了 Resource 类,并与自己的 GWT JettyLauncher 一起扩展,并且感谢在 DefaultServlet 上设置 resourceBase 的小技巧。 code> 通过反射,我能够同时从两个目录提供 webapp 服务。

protected void doStart() throws Exception {
    setClassLoader(new LauncherWebAppClassLoader());
    super.doStart();
    ServletHolder holder = getServletHandler().getServlet("default");
    Servlet servlet = holder.getServlet();
    Field field = servlet.getClass().getDeclaredField("_resourceBase");
    field.setAccessible(true);
    field.set(servlet, combinedResourceBase);
}

It seems that using something like ResourceCollection is sufficient:

http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/resource/ResourceCollection.html

Unfortunately the GWT's DevMode which I use is based on jetty 6, where ResourceCollection is unavailable. I extended the Resource class myself, and together with own GWT JettyLauncher, and thanks to small trick with setting resourceBase on DefaultServlet via reflection, I was able to serve webapp from two directories simultaneously.

protected void doStart() throws Exception {
    setClassLoader(new LauncherWebAppClassLoader());
    super.doStart();
    ServletHolder holder = getServletHandler().getServlet("default");
    Servlet servlet = holder.getServlet();
    Field field = servlet.getClass().getDeclaredField("_resourceBase");
    field.setAccessible(true);
    field.set(servlet, combinedResourceBase);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文