Tomcat undeploy не удаляет артефакты веб-приложений

Эта проблема имеет две типичные причины:

  • Статические поля, используемые объектами, которые вы сохранили в списке
  • Случайно добавив тот же объект в список

Статические поля

Если объекты в вашем списке хранят данные в статических полях, каждый объект в вашем списке будет казаться одним и тем же, поскольку они удерживают одинаковые значения. Рассмотрим следующий класс:

public class Foo {
  private static int value; 
  //      ^^^^^^------------ - Here's the problem!

  public Foo(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }
}

В этом примере есть только один int value, который разделяется между всеми экземплярами Foo, поскольку он объявлен static. (См. учебник «Знакомство с членами класса» .)

Если вы добавите несколько объектов Foo в список, используя приведенный ниже код, каждый экземпляр вернет 3 из вызова to getValue():

for (int i = 0; i < 4; i++) {      
  list.add(new Foo(i));
}

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

Добавление одного и того же объекта

Если вы добавите временную переменную в список, вы должны создать новый экземпляр каждый раз, когда вы выполняете цикл. Рассмотрим следующий ошибочный фрагмент кода:

List list = new ArrayList();    
Foo tmp = new Foo();

for (int i = 0; i < 3; i++) {
  tmp.setValue(i);
  list.add(tmp);
}

Здесь объект tmp был создан вне цикла. В результате один экземпляр объекта добавляется в список три раза. Экземпляр будет содержать значение 2, потому что это значение было передано во время последнего вызова setValue().

Чтобы исправить это, просто переместите конструкцию объекта внутри цикла:

List list = new ArrayList();        

for (int i = 0; i < 3; i++) {
  Foo tmp = new Foo(); // <-- fresh instance!
  tmp.setValue(i);
  list.add(tmp);
}

14
задан Steve Lucord 21 May 2012 в 18:41
поделиться

2 ответа

Могло бы случиться так, что Ваше приложение не может полностью быть не развернуто, потому что существуют фоновые потоки (что Вы, скорее всего, запустили себя), или длительные запросы, которые предотвращают приложение для остановки полностью.

Вы осматривали файлы журнала? Они заявляли, могло ли приложение быть не развернуто успешно? Или противоположное? Можно ли получить дамп Потока после того, как Вы попытались не развернуться (уничтожьте-3 processid на Unix, Ctrl-Break в консоли в Windows), и посмотрите, существует ли что-то все еще выполнение, которое не было должно?

Также обратите внимание, что большинство приложений, которые я видел, не может быть не развернуто полностью относительно памяти, которую они взяли. Я столкнулся с OutOfMemoryErrors (PermGen) довольно часто, особенно после повторного развертывания веб-приложений (Вы найдете много ссылок на PermGen, если Вы погуглите для него), для этого, я полагаю, что повторное развертывание хорошо для машин разработки, но не для производственных. Лучше знать это, прежде чем Вы будете озадачены этим в производстве.

2
ответ дан 1 December 2019 в 09:34
поделиться

Может также быть проблема с блокировкой файлов (особенно в Windows), если вы обращаетесь к ресурсам в библиотеке JAR через URL в вашем приложении.

I просто была аналогичная проблема, и установил ее, изменив следующую строку в

Apache Tomcat / CONF / context.xml

файл:

<Context antiJARLocking="true" antiResourceLocking="true" >

(Обратите внимание, что есть некоторые разногласия относительно того, является ли это производство безопасно, так как он создает копии вашего веб-приложения для каждого повторного развертывания, но если вы работаете в Windows и не можете устранить проблему в источнике, это может обеспечить работоспособное решение).

26
ответ дан 1 December 2019 в 09:34
поделиться
Другие вопросы по тегам:

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