同时从两个目录中提供jetty webapp

时间:2011-03-16 11:08:50

标签: java servlets jetty vfs

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

  • 拥有wabapp目录的主项目
  • 派生项目,它覆盖了webapp目录中的一些文件

主要项目webapp可以在开发模式下启动,这要归功于为jetty提供了适当的WebAppContext

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

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

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

1 个答案:

答案 0 :(得分: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的小技巧,我能够从同时有两个目录。

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);
}