Это - важная персона.
У меня есть хорошо структурированная все же монолитная кодовая база, которая имеет примитивную модульную архитектуру (все интерфейсы реализации модулей все же совместно используют тот же путь к классу). Я понимаю безумие этого подхода и проблем, которые это представляет, когда я иду для развертывания на серверах приложений, которые могут иметь различные конфликтующие версии моей библиотеки.
Я завишу приблизительно от 30 банок прямо сейчас и на полпути хотя bnding их. Теперь некоторые мои модули легки объявить имеющие версию зависимости, такие как мои сетевые компоненты. Они статически ссылочные классы в JRE и других библиотеках BNDded, но моем JDBC связали компоненты, инстанцируют через Class.forName (...) и могут использовать одно из любого количества драйверов.
Я разбиваю все в пакеты OSGi зоной обслуживания.
Я хочу для своего кода смочь все еще использоваться без OSGi через единственный файл банки со всеми моими зависимостями и без OSGi вообще (через JARJAR) и также быть модульным через метаданные OSGi и детализированные пакеты с информацией о зависимостях.
Как я настраиваю свой пакет и свой код так, чтобы он мог динамично использовать какой-либо драйвер на пути к классу и/или в контейнерной среде OSGi (Felix/Equinox/etc).?
Есть ли метод во время выполнения, чтобы обнаружить, если я работаю в контейнере OSGi, который совместим через контейнеры (Felix/Equinox/etc).?
Я должен использовать другой механизм загрузки класса, если я нахожусь в контейнере OSGi?
Требуются, чтобы я импортирую классы OSGi в свой проект смочь загрузить at-bundle-time-unknown JDBC драйвер через мой модуль базы данных?
У меня также есть второй метод получения драйвера (через JNDI, который только действительно применим при выполнении в сервере приложений), я должен изменить свой код доступа JNDI для OSGi-осведомленных серверов приложений?
Простой пример фрагмента:
public static boolean inOSGi() {
try {
Class.forName("org.osgi.framework.FrameworkUtil");
return true;
}
catch (ClassNotFoundException e) {
return false;
}
}
Просто убедитесь, что если вы поместите этот код в пакет, пакет должен импортировать org.osgi.framework (иначе он никогда не найдет этот класс).