Рекомендации по совместному использованию кода веб-уровня (контроллеры и JSP) между аналогичными веб-приложениями

Я работаю над переписыванием стареющих веб-приложений. В частности, есть два, которые очень похожи, но сегодня не имеют никакого кода, и я хочу это исправить.

Проекты переписываются с Maven, Spring MVC и Sitemesh.

Код уровня модели достаточно прост, чтобы делиться с использованием JAR. Но я не знаю никаких хороших способов обмена общим кодом веб-уровня (JSP и контроллеры) между аналогичными приложениями.

Вот некоторый фон. Эти приложения - это интернет-магазины. Один из них - обычный магазин (думаю, amazon.com), который пользователь может войти в систему, найти продукты, добавить в корзину и проверить. Другой - это в основном то же самое, только это сайт punchout. Части обзора продукта и корзины покупок идентичны. Вход и проверка, однако, совершенно разные.

Я упрощаю, но это достаточно, чтобы проиллюстрировать проблему. Там значительная часть кода веб-уровня в разделах просмотра продуктов и покупок, которые должны быть разделены между ними.

Я не думаю, что возможно просто иметь тот же файл WAR, что и "режим", основанный на переменной окружения или настройках из другой базы данных. Одно из отличий - совершенно другая конфигурация безопасности Spring. Также было бы предпочтительнее оставить другие контроллеры входа и проверки вне процесса проверки компонентов, чтобы никто не мог каким-то образом перейти к неправильному с манипуляцией URL.

Я изначально начал использовать Maven Profiles и фильтрацию, чтобы сохранить два разных конфигурационных набора (web.xml, Spring configs и т.д.) в том же проекте WAR. На основании того, какой профиль Maven выбран, результирующая WAR построена с другим конфигурационным набором (и другим понятием для ясности). Это нарушает принцип Maven, что один pom производит один артефакт.

Есть ли лучший способ сделать это? Как насчет Maven WAR Overlays? Я вижу, что люди говорят об использовании наложений для совместного использования общих ресурсов, таких как CSS, JS, изображения и даже некоторые распространенные JSP. Но я не вижу, чтобы кто-то упоминал об общих классах, таких как контроллеры, таким образом.

Я мог бы довести классы Controller до JAR, но логически кажется, что они должны оставаться со своими JSP. И JSP не могут также быть перенесены в JAR (правильно?).

Я также подумал о том, чтобы сделать EAR с несколькими файлами WAR - одной WAR для общего опыта покупок и другой WAR для соответствующего входа и проверки. Я считаю, что сеанс может быть разделен между двумя WARs в одном EAR, но я не уверен, что он играет хорошо с Spring session-scope beans. Я слышал, что они не хранятся в сеансе. Мне также нужно выяснить, что делать с декораторами Sitemesh, которые используются для верхнего/нижнего колонтитула. Такую же конфигурацию Sitemesh и ее ресурсы нужно будет скопировать в оба WAR, верно? Поэтому, в конце концов, артефакт покупок WAR будет по-прежнему отличаться в каждом случае.

Я должен верить, что другие люди раньше это делали. Думаю ли я об этом неправильно? Есть ли общее решение для такого рода вещей?

Ответ 1

Хорошая работа по борьбе с копированием. Почему вы говорите, что сложно разделить JSP? Вы можете скопировать их из общей банки, используя плагин зависимости maven:

 <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <version>2.4</version>
         <executions>
           <execution>
             <id>unpack</id>
             <phase>package</phase>
             <goals>
               <goal>unpack</goal>
             </goals>
             <configuration>
               <artifactItems>
                 <artifactItem>
                   <groupId>com.example</groupId>
                   <artifactId>webapp-common</artifactId>
                   <version>1.0-SNAPSHOT</version>
                   <outputDirectory>[target jsp directory]</outputDirectory>
                   <includes>**/*.jsp</includes>
                 </artifactItem>
               </artifactItems>
             </configuration>
           </execution>
         </executions>
       </plugin>

Ответ 2

Мой предпочтительный вариант в этом случае помещает все связанные файлы (контроллеры, js, изображения...) в банку. Но проблема здесь в использовании файлов JSP: нет простого способа их использования, если они находятся в банке. Но с другими технологиями просмотра, такими как Velocity или Freemarker, это возможно простым способом, среди других преимуществ. Я не знаю, может ли это привести вас к слишком большой работе, но для нового проекта с этими потребностями это лучший вариант.

Ответ 3

Мы используем Subversion здесь и используем svn: externals (вроде символических ссылок), чтобы совместно использовать определенный общий код (в основном .jsp файлы) между проектами. Хорошо работает, мы использовали OC4J, который фактически имеет способ поделиться .jsp между несколькими проектами, но поскольку мы в настоящее время движемся к Tomcat (или что-то еще), я хотел бы придумать контейнерный агностический способ сделать это.

Ответ 4

Синухепоп прав, но его ответ не идеален.

Вот идеальный ответ. вы должны ссылаться на следующий URL-адрес, он может помочь вам.

нажмите здесь

на странице url, пример для поля содержимого не является точным, вы следуете за мной:

если необходимо предоставить общий доступ к файлу:

a.jsp  svn://myhome.com/svn/myproject/trunk/a.jsp

если необходимо открыть папку:

xml  svn://myhome.com/svn/myproject/trunk/xml