Я использовал для управления версиями с тегом в Git. Но это было давно, для автономных приложений. Теперь проблема в том, что у меня есть веб-приложение, и в том же приложении могут подключаться клиенты, которые ожидают связи с разными версиями приложения.
Итак, я добавил во входную переменную путь для версии таким образом:
@PathParam("version") String version
И клиент может указать версию в URL-адресе:
https://whatever.com/v.2/show
Затем через код я добавил такие условия:
if(version.equals("v.2") {
// Do something
}
else if(version.equals("v.3") {
// Do something else
}
else {
// Or something different
}
Проблема в том, что мой код становится очень грязным. Поэтому я решил поступить иначе. Я добавил это условие только в одной точке кода, и оттуда я вызываю разные классы в соответствии с версией:
MyClassVersion2.java
MyClassVersion3.java
MyClassVersion4.java
Проблема в том, что у меня много дублирования.
И я тоже хочу решить эту проблему. Как я могу сделать теперь, чтобы иметь веб-приложение, которое:
1) Deal with multiple versions
2) It is not messy (with a lot of conditions)
3) Doesn't have much duplication
Обычно, когда мы говорим о старой версии приложения, мы имеем в виду, что поведение и внешний вид этой версии бросаются в камень и не меняются. Если вы сделаете хоть малейшую модификацию исходных файлов этого приложения, тогда его поведение и/или внешний вид могут измениться (и в соответствии с законом Мерфи он изменится), что неприемлемо.
Итак, если бы я был вами, я бы заблокировал все исходные файлы старой версии в репозитории исходного кода, чтобы никто не мог их совершить. Этот подход решает проблему и диктует, как вам нужно обойти все остальное: каждая версия должна иметь собственный набор исходных файлов, которые полностью не связаны с исходными файлами всех других версий.
Теперь, если старые версии приложения должны иметь что-то общее с самой новой версией, и эта вещь меняется (скажем, база данных), тогда мы не совсем говорим о разных версиях приложения, у нас есть что-то более похожее на различные скины: ядро приложения развивается, но пользователям, которые выбрали скин некоторое время назад, разрешено придерживаться этого скина. В этом случае решение полиморфизма, которое уже было предложено другими, может быть лучшим подходом.
ваш номер версии находится в месте в URL с именем "Context Root". Вы можете выпускать несколько разных файлов WAR, каждый из которых настроен для ответа на различные корни контекста. Итак, одна война для версии 1, одна война за версию 2 и т.д.
Это приведет к дублированию кода. Так что вы действительно спрашиваете: "Как я могу эффективно модулизовать веб-приложения Java?".
Это большой вопрос и приводит вас к "Enterprise Java". По сути, вам нужно решить эту проблему, абстрагировав свой общий код на другое приложение. Обычно это называется "n-уровневым" дизайном. Таким образом, вы создадите приложение "уровень интеграции", о котором говорят ваши военные файлы уровня презентации. Уровень интеграции содержит весь общий код, чтобы он не повторялся.
Ваш уровень интеграции может быть EJB или веб-сервисами и т.д. Или вы можете исследовать с помощью OSGi.
calling different classes according to the version
.MyClassVersion
родительский классMyClassVersion
с помощью методов общегоMyClassVersion