Было бы возможно иметь библиотеки Spring в общем / общем контексте? - PullRequest
3 голосов
/ 14 сентября 2011

У нас есть приложение портала с одним контекстом основного веб-приложения и множеством второстепенных контекстов веб-приложений - плагинами.В настоящее время (очень упрощенно) у Main есть собственные библиотеки Spring, и плагины должны иметь их также, если они хотят использовать Spring.В общем / общем контексте tomcat есть только драйверы и интерфейсы.

Будет ли это работать, если библиотеки Spring были бы перемещены в общий контекст по отношению к другим библиотекам, которые Spring может использовать косвенно или они могут использовать Spring?Как в hibernate, потому что приложения используют spring-tx и т. Д. Придется ли hibernate переходить в общий / общий контекст?

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

Ответы [ 3 ]

0 голосов
/ 27 сентября 2011

Если вы смогли перейти от Tomcat к полноценному контейнеру Java EE, тогда можно было бы упаковать все как EAR , используя механизм Bundled Optional Classes * .

Затем вы переместите обычные JAR-файлы из WAR-ов и перейдете на верхний уровень EAR.

0 голосов
/ 14 декабря 2011

@ RichW прав, утверждая, что размещение библиотек Spring в общем загрузчике классов Tomcat - плохая практика. И есть большая вероятность, что это не сработает.

Java использует иерархию загрузчика классов ). Когда запрашивается загрузка класса, загрузчик классов будет рекурсивно запрашивать класс у своего родительского загрузчика классов, прежде чем пытаться загрузить класс, используя собственный путь к классу. Этот процесс продолжается до корневого загрузчика классов (известного как загрузчик классов начальной загрузки). Таким образом, классы, на которые ссылается родительский загрузчик классов, всегда получают приоритет над классами, на которые ссылаются загрузчики классов, ниже по иерархии.

Важно отметить, что в этом процессе классы никогда не загружаются из дочернего загрузчика классов. Поэтому любые классы, требуемые Spring, также должны быть загружены в общий загрузчик классов - включая asm, log4j, commons-logging и cglib (все от которых зависит Spring). Это приведет к целому ряду проблем: в частности, регистрация общего достояния в общем пути к классам - это целый мир боли

Если вам действительно удастся запустить Tomcat, у вас возникнут проблемы с утечками памяти при утилизации приложений. В tomcat приложения выгружаются с использованием обычной сборки мусора, поэтому, если что-то содержит ссылку на класс внутри приложения, которое впоследствии было перезапущено, это приложение не получит сборку мусора. Среды Spring и logging являются основными кандидатами для хранения ссылок на классы, поэтому вы, вероятно, будете страдать от ошибок OOM после нескольких перезапусков приложения.

Единственный способ сделать это безопасно - рассмотреть возможность использования полноценного сервера приложений (такого как JBoss AS) и развертывания приложения в качестве EAR.

0 голосов
/ 16 сентября 2011

Да, я знаю, что это заманчиво. Да, это может работать. Но размещение библиотек для конкретных приложений или фреймворков в папке общих библиотек сервера приложений считается плохой практикой, и я согласен.

По моему мнению, веб-приложения должны содержать свои собственные зависимости (фляги приложений, фреймворки фреймворков и т. Д.). Фреймворки также имеют зависимости, часто требующие нескольких jar с определенными версиями. Иногда эти версии меняются, иногда меняются зависимости. Со временем эта папка общей библиотеки станет кухонной раковиной для банок, и это повлияет на все ваши приложения, возможно, непредсказуемым образом.

Пройдя по пути к папке общей библиотеки, вы получаете некоторое небольшое начальное удобство, но вы теряете выбор: выбор затрагивать только одно веб-приложение одновременно. Я рекомендую вам хранить свои фляги в своем веб-приложении, красиво содержащиеся и отделенные от других веб-приложений. Это сделает их более надежными, и вам будет проще работать с обновлениями фреймворка. Я обещаю тебе, что в конечном итоге ты станешь счастливее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...