/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, это может иметь другой порядок, но я не уверен в этом.