Ответ на ваш вопрос очень зависит от приложений, которые вы создаете. Java EE, ESB и OSGi - это подходящие модульные стратегии развертывания для определенных проблем.
Построение корпоративного сервис-ориентированного программного обеспечения по сравнению с подключаемым клиентским приложением - это очень разные приложения с разными решениями.
В настоящее время я работаю над проектом, в котором используются развернутые службы Java EE для бэкэнда и расширенный клиент на основе Eclipse / OSGi, который использует эти службы. Проектирование и развертывание является довольно модульным между бэкэнд-сервисами (Java EE), клиентскими сервисами (чистый OSGi) и компонентами пользовательского интерфейса (плагины Eclipse).
Самым большим фактором, который необходимо преодолеть с помощью любой из этих технологий, является понимание того, как они работают, и надлежащее проектирование ваших приложений для работы с учетом их ограничений. Как уже упоминалось, загрузка классов является довольно непротиворечивой проблемой для любого сложного приложения в этих средах, но понимание этих проблем заранее позволит программному обеспечению быть соответствующим образом разработано для данной технологии.
Использование таких фреймворков, как Spring, в значительной степени способствует написанию кода, который сократит зависимость от базовой технологии, но при этом сможет использовать ее уникальные возможности.