JDBC/OSGi и как динамично загрузить драйверы, явно не заявляя зависимости в пакете?

Это - важная персона.

У меня есть хорошо структурированная все же монолитная кодовая база, которая имеет примитивную модульную архитектуру (все интерфейсы реализации модулей все же совместно используют тот же путь к классу). Я понимаю безумие этого подхода и проблем, которые это представляет, когда я иду для развертывания на серверах приложений, которые могут иметь различные конфликтующие версии моей библиотеки.

Я завишу приблизительно от 30 банок прямо сейчас и на полпути хотя bnding их. Теперь некоторые мои модули легки объявить имеющие версию зависимости, такие как мои сетевые компоненты. Они статически ссылочные классы в JRE и других библиотеках BNDded, но моем JDBC связали компоненты, инстанцируют через Class.forName (...) и могут использовать одно из любого количества драйверов.

Я разбиваю все в пакеты OSGi зоной обслуживания.

  • Мои базовые классы/интерфейсы.
  • Создание отчетов о связанных компонентах.
  • Связанные с доступом к базе данных компоненты (через JDBC).
  • и т.д....

Я хочу для своего кода смочь все еще использоваться без OSGi через единственный файл банки со всеми моими зависимостями и без OSGi вообще (через JARJAR) и также быть модульным через метаданные OSGi и детализированные пакеты с информацией о зависимостях.

  • Как я настраиваю свой пакет и свой код так, чтобы он мог динамично использовать какой-либо драйвер на пути к классу и/или в контейнерной среде OSGi (Felix/Equinox/etc).?

  • Есть ли метод во время выполнения, чтобы обнаружить, если я работаю в контейнере OSGi, который совместим через контейнеры (Felix/Equinox/etc).?

  • Я должен использовать другой механизм загрузки класса, если я нахожусь в контейнере OSGi?

  • Требуются, чтобы я импортирую классы OSGi в свой проект смочь загрузить at-bundle-time-unknown JDBC драйвер через мой модуль базы данных?

  • У меня также есть второй метод получения драйвера (через JNDI, который только действительно применим при выполнении в сервере приложений), я должен изменить свой код доступа JNDI для OSGi-осведомленных серверов приложений?

6
задан Chris 25 April 2010 в 08:06
поделиться

1 ответ

  • Использование любого драйвера в среде OSGi требует использования оператора DynamicImport-Package: *, чтобы ваш пакет мог разрешить эти пакеты при загрузке драйвера с помощью Class.forName (..).
  • Вероятно, самый простой способ - попытаться получить доступ к классу из пакета org.osgi.framework. По крайней мере, они должны быть всегда в среде OSGi (см. Фрагмент ниже). Существуют более сложные механизмы, поэтому дайте мне знать, если вам понадобится что-то более продвинутое. Также обратите внимание на базовую спецификацию OSGi R4.2, параграф 3.8.9, в котором показаны некоторые методы поиска Bundle и BundleContext класса и, следовательно, косвенно помогает определить, находитесь ли вы во фреймворке или нет.
  • Это зависит от того, что вы делаете, здесь нет общего «да» или «нет». OSGi использует загрузчики классов и делает это не «типичным» способом для стандартного Java-приложения, но в зависимости от того, что вы делаете, вы можете этого не заметить.
  • Нет.
  • Взгляните на недавно выпущенные корпоративные спецификации OSGi. У них есть глава об интеграции JNDI в OSGi, которая, вероятно, позволяет вам оставить свой код (в основном) без изменений.

Простой пример фрагмента:

 public static boolean inOSGi() {
  try {
   Class.forName("org.osgi.framework.FrameworkUtil");
   return true;
  }
  catch (ClassNotFoundException e) {
   return false;
  }
 }

Просто убедитесь, что если вы поместите этот код в пакет, пакет должен импортировать org.osgi.framework (иначе он никогда не найдет этот класс).

7
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: