Нет способа настроить tomcat для удаления классов, на которые все еще есть ссылки. Самый простой способ (вероятно, не единственный) вызвать это - запустить поток из вашего веб-приложения, а не завершить его, когда приложение не развернуто: для Tomcat этот поток тогда недоступен, но для JVM запущенный поток является допустимый корень для классов, которые не могут быть собраны сборщиком мусора.
Tomcat делает все возможное, чтобы обнаружить и указать такое условие, но на самом деле не может пойти против JVM и сборщика мусора и отбросить совершенно допустимые объекты, на которые все еще ссылаются.
Шаги, которые вы делаете, включая остановку и запуск tomcat, кажутся невозможными: после того, как вы завершите работу JVM, единственный шанс для вновь запущенной JVM сослаться на старые классы, если он овладеет ими. Но вы также заявляете, что удаляете рабочий каталог (как насчет временного каталога?). Вы также должны убедиться, что вы действительно удаляете нужный контент, а не контент какого-либо другого сервера в аналогичном каталоге. Кроме этого: кажется, вы просто упускаете почти очевидное место, где расположены старые классы. Как только они будут перезапущены, может возникнуть условие, которое я описал выше. Реализация веб-приложения никак не может обеспечить хорошее поведение и не запускать случайные фоновые потоки, не прерывая их.
Возможно, вы захотите проверить, отличаются ли CATALINA_HOME и CATALINA_BASE, и могут дать подсказку о других приложениях, развернутых под тем же именем, и если ваше приложение запускается, когда вы просто удаляете файлы, которые вы описали, то запускайте (без нового развертывания)