Обслуживание причального веб-приложения из двух каталогов одновременно - PullRequest
1 голос
/ 16 марта 2011

В разработке я использую причал в качестве контейнера сервлета.У меня есть следующая конфигурация разработки:

  • мастер-проект с каталогом wabapp
  • производный проект, который переопределяет некоторые файлы в каталоге веб-приложения

МастерВеб-приложение проекта может быть запущено в режиме разработки благодаря предоставлению соответствующего WebAppContext для jetty.

Теперь я хочу запустить производный проект аналогичным образом, предполагая, что при выполнении запроса предпринимается попытка:

  • получить ресурс из каталога webapp производного проекта
  • , если он не существует, получить его из каталога webapp главного проекта

Я знаю, что можно переопределитьWebAppContext#getResource(), однако некоторые библиотеки, которые мы используем в проекте, по-видимому, выполняют операции ввода-вывода в каталоге wabapp самостоятельно.Например, вызвав ServletContext#getRealPath("/"), а затем читая файлы без использования метода ServletContext#getResource().Проблема может быть решена на более низком уровне некоторой виртуальной файловой системой поверх File, однако она не поддерживается в JDK 1.6, какие-либо предложения?

1 Ответ

1 голос
/ 21 марта 2011

Кажется, что использовать что-то вроде ResourceCollection достаточно:

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

К сожалению, DevMode GWT, который я использую, основан на 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);
}
...