Какова эквивалентность contextDestroyed() в ServletContainerInitializer?

Мне нужно создать класс, который реализует ServletContextListener, чтобы добавить событие во время инициализации или закрытия Tomcat. Однако класс должен находиться в файле jar внутри WEB-INF/lib. После некоторых чтений я узнал, что это невозможно, и альтернативой является использование ServletContainerInitializer. Однако доступен только метод onStartup(). Есть ли другие альтернативы, где я могу добавить событие во время выключения или разрушения веб-приложения? Я использую Tomcat 8 и java 8 btw.

Ответ 1

Пусть ваш ServletContainerInitializer программно добавляет ServletContextListener, который, в свою очередь, выполняет желаемое задание в contextDestroyed().

servletContext.addListener(YourServletContextListener.class);

Ответ 2

Не уверен, как вы протестировали свой код. Но это ServletContextListener отлично работает для меня на Tomcat 8.5.5. Просто попробуйте этот код, не нужно помещать его в отдельный файл JAR.

@WebListener
public class AppContextListener implements ServletContextListener{

    Logger log = LoggerFactory.getLogger(AppContextListener.class);

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {

    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        log.info("### Context is destroyed ###");
    }
}