1

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

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

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

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

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

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

4

1 回答 1

1

似乎使用类似的东西ResourceCollection就足够了:

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

不幸的是,我使用的 GWT 的 DevMode 基于 jetty 6,其中 ResourceCollection 不可用。我自己扩展了Resource课程,并与自己的 GWT 一起扩展了课程JettyLauncher,并且由于通过反射设置resourceBase的小技巧DefaultServlet,我能够同时从两个目录提供 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);
}
于 2011-03-21T17:05:46.453 回答