Это поведение является преднамеренным, и оно позволяет вам переопределять библиотеки, предоставляемые в самом Tomcat, независимо в каждой WAR.Например, вы можете переопределить Log4J с разными версиями для каждого приложения, развернутого в контейнере, не создавая проблем и не нарушая другие приложения.Из документации Tomcat :
Как и многие серверные приложения, Tomcat устанавливает различные загрузчики классов [...] до , позволяющие использовать различные части контейнера и вебприложения, работающие на контейнере , до имеют доступ к различным репозиториям доступных классов и ресурсов .Этот механизм используется для обеспечения функциональности, определенной в спецификации сервлета, версия 2.4, в частности, в разделах 9.4 и 9.6.
Он нарушает алгоритм обычного делегирования, но так работает другой сервер приложений.также (например, JBoss).
Ad.вопрос 2 : Да, это опасно, вы должны помнить о синхронизации и не иметь никакого контроля над тем, кто изменяет эту переменную.Я бы вообще не использовал static
полей.
Например, EhCache позволяет вам поделиться CacheManager
.Это осуществляется через поле net.sf.ehcache.CacheManager#singleton
static volatile
.Теперь вы получаете все виды проблем: если вы введете ehcache.jar
в Tomcat /lib
, он будет работать как положено.Однако, если у каждого веб-приложения есть своя собственная копия файла JAR, совместное использование не будет работать, поскольку у каждого веб-приложения есть своя собственная копия класса CacheManager
.Еще хуже, когда только одно приложение имеет свой собственный ehcache.jar
- все приложения будут использовать один и тот же экземпляр CachedManager
, за исключением одного, в котором ehcache.jar
упакованы вместе.Такую ошибку очень трудно отследить ...