/WEB-INF/classes vs/WEB-INF/lib

Я хотел бы упаковать мои веб-классы Java EE6 (beans, фильтры, сервлеты) в jar и поместить его в каталог /WEB-INF/lib/ вместе с другими утилитами jars и полностью отказаться от каталога /WEB-INF/classes/.

Существуют ли существенные различия между ними в плане загрузки классов, контекста приложения и т.д.?

Спасибо.

PS: Всякий раз, когда вы запускаете какие-либо спецификации java, я всегда перенаправляюсь на индекс документации Oracle, который составляет десяток кликов от исходного URL-адреса. Кто-нибудь знает, что там происходит?

Ответы

Ответ 1

Я бы пошел за /WEB-INF/classes. Он позволяет запускать ваше приложение в режиме отладки и классах с "горячей заменой" при изменении. Если вы упаковываете все как банку, вам придется переупаковывать и повторно развертывать приложение каждый раз, когда вы меняете класс.

Ответ 2

Итак, коротко: представьте, что у вас есть класс org.example.Test.class, если вы поместите его в jar и в каталог WEB-INF/lib/ и скопируйте тот же класс в WEB-INF/classes/, тогда загрузчик классов этого приложения будет использовать последний (от WEB-INF/classes/).

Иногда вы можете использовать его как преимущество - у меня есть библиотека, и у меня есть ошибка... Я ищу источник этого класса (где ошибка, я пропускаю часть того, как я знаю, что ошибка в этом классе, это другая история), я добавляю этот класс к проекту с фиксированным кодом и компилируется в WEB-INF/classes/, а библиотека все еще существует в WEB-INF/lib/. Исправленный класс будет использоваться до тех пор, пока библиотека не будет исправлена.

Ответ 3

В определении контейнера Tomcat Servlet: WEB-INF\classes выполняется поиск до WEB-INF\lib. Вы можете делегировать загрузку классов в свой пользовательский загрузчик классов - даже тогда поддерживается порядок выше.

Если вы решите пойти с другим поставщиком, например. JBOss, Glassfish, Jetty, это может иметь другой порядок, но я не уверен в этом.