Я работаю над переписыванием стареющих веб-приложений. В частности, есть два, которые очень похожи, но сегодня не имеют никакого кода, и я хочу это исправить.
Проекты переписываются с 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 будет по-прежнему отличаться в каждом случае.
Я должен верить, что другие люди раньше это делали. Думаю ли я об этом неправильно? Есть ли общее решение для такого рода вещей?