В соответствии с принципом открытости-закрытости я обычно разрабатываю свой Java пакеты и библиотеки таким образом, что существует общий интерфейс или пакет / библиотека API и одна или несколько реализаций (очень похожих на многие распространенные API, такие как JDBC или JAXP / SAX). Чтобы найти реализацию (или иногда несколько реализаций) в базовой библиотеке API, не нарушая OCP, я обычно использую Java ServiceLoader, или иногда сканирование пути к классам через сторонние библиотеки, такие как ClassGraph или Размышления. С точки зрения Maven реализации представлены как runtime
зависимости (поскольку они нужны только во время выполнения, но не во время компиляции). Довольно стандартный материал.
Итак, теперь я хочу сделать некоторые из этих пакетов доступными в виде пакетов OSGi (с API и реализацией в отдельных пакетах), но поскольку в OSGi каждый пакет имеет свой собственный загрузчик классов, ни сканирование пути к классам, ни ServiceLoader
API не будут работать для этой цели. . На первый взгляд механизм фрагментации OSGi кажется наиболее близким эквивалентом описанной выше простой Java-установки. В этом сценарии пакет API будет хостом фрагмента, а конкретные реализации будут присоединяться как фрагменты к этому пакету хоста. Поскольку хост фрагмента и все присоединенные к нему фрагменты используют один и тот же загрузчик классов, стандартные механизмы простой Java, такие как ServiceLoader
или ClassGraph, вероятно, по-прежнему будут работать. Это также имело бы преимущество, заключающееся в том, что не было бы необходимости определять, работает ли библиотека / пакет в контексте OSGi или нет, и не требуются никакие зависимости каркаса OSGi.
Итак, вкратце, у меня вопрос: являются ли фрагменты правильным способом реализации зависимостей только времени выполнения в OSGi или есть лучший (или более стандартный) способ? Предпочтительно, я ищу решение, которое работает в контейнере OSGi, но не требует зависимости от самого OSGi.