Tomcat развертывает старую версию веб-приложения

То, что вы пытаетесь сделать, очень полезно, и я считаю, что мне нужно делать это очень часто в коде, который я пишу. Пример использования:

Скажем, у нас есть интерфейс Foo, и у нас есть пакет zorking, который имеет ZorkingFooManager, который создает и управляет экземплярами package-private ZorkingFoo implements Foo. (Очень распространенный сценарий.)

Итак, ZorkingFooManager должен содержать private Collection<ZorkingFoo> zorkingFoos, но ему нужно выставить public Collection<Foo> getAllFoos().

Большинство java-программистов не подумали бы дважды прежде чем реализовать getAllFoos() как выделение нового ArrayList<Foo>, заполнив его всеми элементами из zorkingFoos и вернув его. Мне нравится развлекать мысль о том, что около 30% всех тактовых циклов, потребляемых java-кодом, работающим на миллионах компьютеров по всей планете, ничего не делает, кроме создания таких бесполезных копий ArrayLists, которые собирают микросетки после мусора после их создания.

Решение этой проблемы - это, конечно, сбрасывание коллекции. Вот лучший способ сделать это:

static <T,U extends T> List<T> downCastList( List<U> list )
{
    return castList( list );
}

Что приводит нас к функции castList():

static <T,E> List<T> castList( List<E> list )
{
    @SuppressWarnings( "unchecked" )
    List<T> result = (List<T>)list;
    return result;
}

Промежуточная переменная result необходима из-за извращение языка java:

  • return (List<T>)list; создает исключение «непроверенного броска»; Все идет нормально; но затем:
  • @SuppressWarnings( "unchecked" ) return (List<T>)list; является незаконным использованием аннотации подавления-предупреждений.

Итак, хотя это не кошерно использовать @SuppressWarnings на return, очевидно, что использовать его при назначении, поэтому дополнительная переменная «result» решает эту проблему. (Он должен быть оптимизирован либо компилятором, либо JIT в любом случае.)

4
задан Fussel 23 January 2019 в 07:31
поделиться

1 ответ

Как сказано в документации Apache Tomcat :

Сравнение строк используется для определения порядка версий.

Это просто не то же самое, что сравнение версий артефактов Maven. Версия 2.0.2 всегда больше при сравнении строк, чем 2.0.10 или даже 2.0.15000 и т. Д.

Я полагаю, у вас есть что-то подобное в вашем pom.xml:

<properties>
  <buildTimestamp>${maven.build.timestamp}</buildTimestamp>
  <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
</properties>
<build>
  <finalName>${project.artifactId}##${project.version}_${maven.build.timestamp}</finalName>
</build>

Вы можете изменить это на:

<finalName>${project.artifactId}##${maven.build.timestamp}_${project.version}</finalName>

, что дает имя файла, например WebappName##201901010000_0.2.10-SNAPSHOT.war.

Таким образом, самая текущая сборка по метке времени будет развернута как текущая активная версия приложения.

В качестве альтернативы вы можете сохранить схему версий имени файла .war и вместо этого развернуть свое приложение, используя версионное имя файла для вашего context.xml:

apache-tomcat/conf/Catalina/localhost/WebappName##201901010000.xml с содержимым:

[ 112]

В Apache Tomcat Manager это будет отображаться как версия 201901010000 в столбце версии приложения. Снова самая последняя сборка по метке времени будет развернута как текущая активная версия приложения, независимая от версии артефакта Maven, так как версия развертывания String берется из имени файла .xml вместо имени файла .war.

0
ответ дан Selaron 23 January 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: