OSGi окупается, потому что он обеспечивает модульность во время выполнения, чего у вас раньше не было, что часто приводило к срыву дизайна на бумаге и реализации. Это может быть большой победой во время разработки.
Это определенно помогает упростить работу в командах, если вы позволяете командам сосредоточиться на одном модуле (возможно, на наборе пакетов) и если вы правильно настроили модульность. Можно утверждать, что можно сделать то же самое с помощью инструмента сборки, такого как Ant + Ivy или Maven и зависимостей, степень детализации зависимостей, которые использует OSGi, на мой взгляд, намного выше, не вызывая типичного «перетаскивания во всем плюс кухонная раковина». что вызывают зависимости уровня JAR.
Модульный код с меньшим количеством зависимостей имеет тенденцию приводить к более чистому и меньшему количеству кода, что, в свою очередь, приводит к уменьшению количества ошибок, которые легче тестировать и устранять. Он также способствует разработке компонентов как можно более простым и понятным, в то же время имея возможность подключать более сложные реализации или добавляя такие аспекты, как кэширование, в качестве отдельных компонентов.
Горячее развертывание, даже если вы не используете его во время выполнения, является очень хорошим тестом для проверки правильности модульной настройки приложения. Если вы не можете запускать свои пакеты в случайном порядке, вам следует выяснить, почему. Кроме того, это может значительно ускорить ваш цикл разработки, если вы сможете обновить произвольный пакет.
Пока вы можете управлять своими модулями и зависимостями, большие проекты остаются управляемыми и могут легко развиваться (избавляя вас от, возможно, плохого «полного переписывания»).
Недостаток OSGi? Это очень низкоуровневая структура, и, хотя она решает проблемы, для которых она предназначена, довольно хорошо, есть вещи, которые вам все еще нужно решить самостоятельно. Особенно если вы пришли из среды Java EE, где вы получаете бесплатную потоковую безопасность и некоторые другие концепции, которые могут быть весьма полезны, если они вам нужны, вам нужно самим найти решения для них в OSGi.
Распространенная ошибка - не использовать абстракции поверх OSGi, чтобы сделать это проще для среднего разработчика. Никогда не позволяйте им связываться с ServiceListeners или ServiceTrackers вручную. Тщательно продумайте, что такое пакеты, а какие нельзя делать: готовы ли вы предоставить разработчикам доступ к BundleContext или скрыть все это от них, используя некоторую форму декларативной модели.